PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt3 verstehe nicht wie der QString funktioniert.



chapaev
10-11-2004, 11:21
Hi alle!

Ich weis das für Qt 3 software Entwickler ist es üblich das man mit QString arbeitet! Aber ich komme damit nicht klar! Ich versuche mit hilfe von QString information aus schel zu holen

void Form1::buttonClicked()
{
textEdit1->setText( const QString & )
}
Wo soll ich den Shell Befehl (sagen wir mal "set") eintragen? :confused:

Vor mir liegt ein Buch über QT Programmierung, aber da gibt es keine Erklerung wie genau das geht.

MfG
chapaev

peschmae
10-11-2004, 12:12
Was willst du genau?

QString ist nur um mit Strings rumzubasteln. Mit der Shell und Umgebungsvariablen (darum gehts dir doch?) hat das so nichts zu tun.

MfG Peschmä

Boron
10-11-2004, 14:01
Es gibt die Funktion getenv(). Mit der kannst du Umgebungsvariablen auslesen.
Hier ist sie beschrieben: http://man.he.net/man3/getenv

Den Rückgabewert einfach einer QString Variablen zuweisen, wenn du magst.

chapaev
10-11-2004, 14:03
Mir geht es darum, wie ich shell Befehle ausführen kann und die ausgabe in ein textEdit widget einfügen kann! Wenn das nicht mit QString geht, wie dann? :confused:

chapaev
10-11-2004, 14:54
Ich will bestimmte shell programme ausführen z. B. emerge, apt-get usw. wie bringe ich Qt dazu, dass er es macht? Natürlich wenn es überhaupt geht! :)

Boron
10-11-2004, 15:24
Schau dir die Klasse QProcess in der Doku an.
Das sollte das sein, was du brauchst.

chapaev
11-11-2004, 08:42
Das war genau das was ich brauchte! THX ;)

chapaev
19-11-2004, 09:40
Ich habe noch ein paar fragen.
ich habe jetzt Qrocess eingebunden.

void EmergeSettings::emerge()
{
process = new QProcess(this);
process->addArgument("emerge");
process->addArgument(ebuildFile);
process->start(); }
aber wie mache ich dass QT aus der Ausgabe USE Flags rausholt und danach CheckBoxes erstellt: die Ausgabe siht so aus:

Calculating dependencies ...done!
[ebuild R ] kde-base/kdebase-3.3.1 +arts +cups -debug +java -ldap +opengl +pam -samba* +ssl -xinerama* 0 kB

Total size of downloads: 0 kB
(die USE Flags sind "+arts +cups -debug +java -ldap +opengl +pam -samba* +ssl -xinerama" )

Es gibt noch eine andere Möglichkeit. Ich kann die ausgabe in ein Textdatei speichern und von da aus rausfiltern. Aber die erste Methode wehre mir lieber.

Ich weis dass die Fragen blöd klingen aber ich komme einfach mit QT Assistant nicht klar! :(

MfG
chapaev

Boron
19-11-2004, 10:54
Es gibt die readStdout() Methoden. Was zurückgeliefert wird steckst du in einen QString, oder in mehrere.
Wie du diesen String dann zerpflückst ist dein Bier :).

anda_skoa
19-11-2004, 13:17
Du musst zuerst mal einen Slot mit dem readReadStdout Signal des QProcess verbinden, damit du überhaupt weißt, wann du lesen kannst.

Zum Zerlegen entweder einen QRegExp verwenden, oder zB an "+" in eine QStringList splitten (QStringList::split)

Ciao,
_

chapaev
19-11-2004, 19:27
Kann mir jemand erkleren warum es nciht klap die Ausgabe in ein TexteEit zu bekommen: Kompilation gab keine Fehler aus und genauseo stand es in einem Beispiel (fast genauso):

void settingsDlg::emergeProcess()
{
process = new QProcess(this);
process->addArgument("ls");
process->addArgument(" /var/tmp");
process->start();
connect( process, SIGNAL(readyReadStdout()),
this, SLOT(readFromStdout()) );
}

void settingsDlg::readFromStdout()
{
description->append( process->readStdout() ); //deskreption ist ein Textedit widget
}

chapaev
24-11-2004, 14:24
Ich wollte fragen ob mir jemand ein Beispiel machen kann wie ich aus eine Textdatei (amorok-1.1.ebuild) die DESCRIPTION auslesen kann. Die Datei siht volgendemassen aus:

# Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/media-sound/amarok/amarok-1.1_beta2.ebuild,v 1.1 2004/09/15 21:20:13 eradicator Exp $

inherit kde eutils

DESCRIPTION="amaroK is a media player for KDE"
HOMEPAGE="http://amarok.kde.org/"
SRC_URI="mirror://sourceforge/amarok/${P}.tar.bz2"

LICENSE="GPL-2"
SLOT="0"

# ppc: please test out libvisual!
KEYWORDS="~x86 ~ppc ~amd64"

IUSE="cjk gstreamer xmms opengl xine libvisual noamazon"
DEPEND="!ppc? ( >=media-libs/libvisual-0.1.6 )
arts? ( >=kde-base/kdemultimedia-3.2 )
gstreamer? ( >=media-libs/gst-plugins-0.8.1 )
opengl? ( virtual/opengl )
xmms? ( >=media-sound/xmms-1.2 )
xine? ( >=media-libs/xine-lib-1_rc4 )
libvisual? ( >=media-libs/libvisual-0.1.6 )
>=media-libs/tunepimp-0.3.0
>=dev-util/pkgconfig-0.9.0
>=media-libs/taglib-1.3
>=kde-base/kdelibs-3.2
>=x11-libs/qt-3.3"

need-kde 3.2

src_unpack()
{
if ! use gstreamer && ! use xine && ! use arts
then
die "You must enable either Gstreamer, aRts or Xine"
fi
kde_src_unpack
}

src_compile()
{
PREFIX="`kde-config --prefix`"
myconf="`use_with arts` `use_with gstreamer`"
myconf="${myconf} `use_with opengl` `use_with xine`"
if use noamazon
then myconf="$myconf --disable-amazon"
fi

kde_src_compile myconf configure make || die
}

Übrigens das mit QProcess hat sich irgend wie von selbst erledigt :o

Boron
24-11-2004, 14:35
QFile* file= new QFile( "/pfad/zu/datei");
file->open( IO_ReadOnly);
QString* tempString = new QString();

while ( !file->atEnd() )
{
file->readLine( *tempString, 50 );
if ( tempString->startsWith("DESCRIPTION"))
{
// mit tempString->remove(..) alles entfernen, was weg muss
// jetzt hat tempString nur doch die Description :-)
}
}So habe ich das mal gemacht. Ersetze die zwei Kommentarzeilen durch Code.

Kein eigener Prozess mehr notwendig :)?

chapaev
24-11-2004, 14:50
Emerge Process ist immer noch notwandig, aber ich überlege mir noch grad wie ich das mache. Ich dechte nur, wenn ich weiß wie ich aus einem Text das rausfiltern kann, dann kann ich das auch aus QProcess rausfiltern ;)
In Shell wehre das ja kein problem mit "grep" und "sed" aber Qt lehrne ich noch!

Vielen dank fuer die Hilfe.

anda_skoa
25-11-2004, 11:37
Wenn du den Inhalt schon in einem String hast, kannst du zB mit QString::find und ähnlichen Methoden arbeiten.

Eine sehr einfache Möglichkeit ist auch, zuerst in eine Liste von Zeilen aufzuspalten und dann die besondere Zeile nochmal am Trennzeichen, in deinem Fall =

QStringList::split()

Ciao,
_

chapaev
25-11-2004, 14:19
Ich habe (einfach als test) volgende code:


QStringList list;
list << "+arts" "+cups" "-debug" "+java" "-ldap" "+opengl" "+pam";
list = list.grep( "+" );
die Frage ist: wie leite ich die Ausgabe in ein TextEdit?
Ich habe schon alles ausprobiert :(

TextEdit -> list;
TextEdit << list;
TextEdit -> setText(lsit);
TextEdit -> append(list->show());

Bekomme immer ein Fehlermeldung! Im buch über qt stehen keine andere Methoden(jedenfals habe ich keine entdeckt).

anda_skoa
25-11-2004, 15:11
Zum Darstellen mußt du die StringList schon wieder zu einem String zusammenfügen, die Methode setText kann schließlich nur einen QString nehmen.

QStringList::join wenn du alle Teile in der StringList im Ergebnis haben willst.

Ciao,
_

chapaev
25-11-2004, 21:40
Kannst du mir bitte auch ein Beispiel zeigen? Ich sitze nemlich schon den ganzen Tag rum und teste verschiedene Möglichkeiten wie das gehen könnte, aber es klappt einfach nicht. Ich denke QT ist doch zu schwer für mich, es ist nciht vergleichbar mit basic und shell! :rolleyes:

peschmae
26-11-2004, 01:06
Sowas?



QStringList list;
list << "arts" << "cups" << "-debug" << "+java" << "-ldap" << "+opengl" << "+pam";
list = list.grep( "+" );

textEdit.setText(list.join(" "));


MfG Peschmä

chapaev
26-11-2004, 07:34
Ich habe schon öffters diese Methode gesehen:

description.setText(list.join(" "));
Aber ich verstehe nicht wo die Unterschied ist? Ob ich das mache:

description->setText(list.join(" "));
oder das:

description.setText(list.join(" "));

anda_skoa
26-11-2004, 09:42
Da ist ansich kein Unterschied im Methodenaufruf, es ist immer setText(const QString&)

Die unterschiedliche Notation ist auf den Typ des Objekts zurück zuführen.
bei "->" liegt es als Pointer auf eine Instanz vor, bei "." ist es direkt die Instanz.

Widgets werden praktisch (fast) immer mit "new Kontruktor()" erzeugt, daher wird bei Methodenaufrufen an Widgets auch immer "variable->methode()" benutzt.

Ciao,
_

chapaev
26-11-2004, 20:41
void settingsDlg::init()
{
settingsBox->hide();

QFile* file= new QFile( "/home/chapaev/Documents/amarok/amarok-1.1.ebuild");
file->open( IO_ReadOnly);
QString* tempString = new QString();

while ( !file->atEnd() )
{
file->readLine( *tempString, 50 );
if ( tempString->startsWith("DESCRIPTION"))
{

tempString->remove( " " );
description->setText(tempString.join(""));
}
}
}
so wei ich das verstanden habe, funktioniert das nur bei QStringList (ich meine das mit join())
Wie kann ich das dann in diesem Fall machen? Und wo soll ich das nachschlagen (Qt Assistant), bei dem QString oder dem Qfile? :confused:

peschmae
27-11-2004, 07:39
ein
delete tempString;
wäre eine gute Idee. Aber du brauchst hier gar nicht mit Pointern arbeiten.

MfG Peschmä

anda_skoa
27-11-2004, 16:13
so wei ich das verstanden habe, funktioniert das nur bei QStringList (ich meine das mit join())

Würde hier ja auch keinen Sinn machen :)
Join macht ja aus den Elementen der Liste einen String, hier hast du schon einen String.



Wie kann ich das dann in diesem Fall machen?

Da du einen String Pointer hast, musst du den natürlich zuerst dereferenzieren.



Und wo soll ich das nachschlagen (Qt Assistant), bei dem QString oder dem Qfile? :confused:
In einem Buch über C++ Grundlagen, bzw. nur mit Pointern arbeiten, wenn das auch nötig ist.

Ciao,
_

chapaev
15-12-2004, 08:02
So wie ich das verstanden habe, besitzt QString in diesem Fall kein "Text".


void settingsDlg::readFromEbuild()
{
QFile* file= new QFile( ebuildSelected->text() );
file->open( IO_ReadOnly);
QString* tempString = new QString();
while ( !file->atEnd() )
{
file->readLine( *tempString, 50 );
description->setText(tempString.asii());
}
}

Weil wenn ich das mache:

void Form1::lessStart()
{
QString str = "parts pro toto";
outputLabel->setText(str);
}
klappt alles.

Die frage ist nun: wie wandele ich tempString zu einem Text um?
Im Qt Buch steht zwar zimlich viel über QStrings, aber ist alles immer das selbe
QString str = "bla bla" :mad:

Kann mir jemand ein Beispiel zeigen wei ich den tempString (code 1) in einem textEdit ausgeben kann? Ich habe schon semtliche Möglichkeiten ausprobiert. Hat leider nichts gebracht :rolleyes:

PS: Übrigens im Buch (QT) habe ich nichtst über Pointern gefunden. :(

anda_skoa
15-12-2004, 15:34
So wie ich das verstanden habe, besitzt QString in diesem Fall kein "Text".

Würde keinen Sinn machen, der String ist ja der Text.



Die frage ist nun: wie wandele ich tempString zu einem Text um?

tempString ist hier unnötigerweise ein Pointer auf einen String, setText erwartet aber den String selbst.
Dazu müsste man den Stringpointer zuerst derefernzieren, aber besser wär, gleich eine normale Stringvariable zu benutzen und keinen Pointer.
Selbiges für QFile, falls du es nur in dieser Methode brauchst.



Kann mir jemand ein Beispiel zeigen wei ich den tempString (code 1) in einem textEdit ausgeben kann? Ich habe schon semtliche Möglichkeiten ausprobiert. Hat leider nichts gebracht :rolleyes:


Nachdem du vermutlich den gesamten Fileinhalt anzeigen willst, geht das am einfachsten so


QFile file("dateiname);
if (file.open(IO_ReadOnly))
{
QString text = file.readAll();
textedit->setText(text);
}




PS: Übrigens im Buch (QT) habe ich nichtst über Pointern gefunden.

Im Qt Buch wird auch die Kenntnis von C++ Grundlagen vorrausgesetzt, denke ich mal.
Ein Pointer auf eine Instanz einer Qt Klasse ist schließlich nicht anders als ein Pointer auf eine andere C++ Klasse, darum auch nicht extra veschrieben.
Dort wo es Unterschiede zur generellesn C++-Vorgangsweise gibt, wird das auch angeführt (zB automatisches freigeben von QObject Instanzen durch ihre Parents)

Ciao,
_

chapaev
17-12-2004, 17:05
anda_skoa, peschmae und Boron, erst möchte ich euch allen danke sagen! ;)


Im Qt Buch wird auch die Kenntnis von C++ Grundlagen vorrausgesetzt, denke ich mal.
Ach so! deshalb kapiere ich alles so langsam :D
Dann besorge ich mir mal ein Buch über C++.

Ich will euch natürlich nicht nerven, aber ich komme nicht weiter.
Damit splitte ich QString in wörter:


QFile file( ebuildSelected->text() );
if (file.open(IO_ReadOnly))
{
QString fileInhalt = file.readAll();
QStringList list = QStringList::split( " ", fileInhalt );
list = list.grep( "DESK" );
description->setText( list.join( " " ) );
}

Was kann ich anstatt " " (split( " ", fileInhalt )) nehmen?
Wie ich festgestellt habe, mit "\n" klappt es nicht!

chapaev
17-12-2004, 20:27
Das oben beschriebene brauche ich nicht mehr, hab eine FAQ für C Probrammierung gefunden!

Ich habe nur eine Frage, warum hat mir kine gesagt das mit pointer arbeiten das selbe ist wie mit Strings nur mit * :rolleyes:

MfG
chapaev

anda_skoa
18-12-2004, 13:20
Das oben beschriebene brauche ich nicht mehr, hab eine FAQ für C Probrammierung gefunden!

:)
Ist aber mit Vorsicht zu genießen, C Sachen sind nicht immer auf C++ übertragbar, bzw. gibt es in C++ oft einfachere Lösungen.



Ich habe nur eine Frage, warum hat mir kine gesagt das mit pointer arbeiten das selbe ist wie mit Strings nur mit * :rolleyes:


Äh, was? :confused:

Ciao,
_

chapaev
18-12-2004, 17:42
Zitat:
Ich habe nur eine Frage, warum hat mir kine gesagt das mit pointer arbeiten das selbe ist wie mit Strings nur mit *


Äh, was?

Es ist doch so, wenn man ein String in ein Pointer verwandelt, alles was sich ändert ist *!
z. B. String: textEdit->setText(string)
Pointer: textEdit->setText(*string)

Ich habe ein Problem mit utf8 und zwar:

inputStr.replace("A", "А");
inputStr.replace("a", "а");
......
.....
.....
outText->setText(inputStr.utf8());
Wieso bekomme ich am ende anstatt utf komische Zeichen?

peschmae
18-12-2004, 17:49
Es ist doch so, wenn man ein String in ein Pointer verwandelt, alles was sich ändert ist *!
z. B. String: textEdit->setText(string)
Pointer: textEdit->setText(*string)


Das ist jetzt definitiv der unwichtigste Teil von "all dem was sich ändert". Am besten schaust du wirklich mal in ein C++ Grundlagenbuch wie Thinking in C++ von Bruce Eckel (online lesbar) oder so.

MfG Peschmä

anda_skoa
19-12-2004, 07:56
Es ist doch so, wenn man ein String in ein Pointer verwandelt, alles was sich ändert ist *!

Nennt man dereferenzieren, hab ich glaub ich auch mal erwähnt.
Ist halt nicht so leicht, das Kenntnisniveau von C++ Anfängern abzuschätzen :)



Wieso bekomme ich am ende anstatt utf komische Zeichen?

Der Code sieht bischen komisch aus.
setText sieht jetzt im Kontext der anderen Beiträge wie eine Methode aus, die einen QString als Parameter hat und die Variable sieht wegen der Methode utf8() wie ein QString aus.
Warum rufst du dann utf8() auf, das einen C String zurückgibt?

Ciao,
_

chapaev
21-12-2004, 17:48
Das ist jetzt definitiv der unwichtigste Teil von "all dem was sich ändert". Am besten schaust du wirklich mal in ein C++ Grundlagenbuch wie Thinking in C++ von Bruce Eckel (online lesbar) oder so.
Ja ok noch ädern sich die Methoden wie man was und wo einsetzt, aber im Prinzip ist es das selbe :D


Der Code sieht bischen komisch aus.
setText sieht jetzt im Kontext der anderen Beiträge wie eine Methode aus, die einen QString als Parameter hat und die Variable sieht wegen der Methode utf8() wie ein QString aus.
ähh, sorry aber ich habe kein wort verstanden. :)
Naja wahrscheinlich muss ich noch die Begriffe lehrnen! :D

Warum rufst du dann utf8() auf, das einen C String zurückgibt?
So wie ich das verstehe (hab irgend wo gelesen), wird ein QString immer in utf8 erstellt (wenn man nichts vorgiebt). Also muss es am Textedit liegen. Wie sonst kann ich einem TextEdit weis machen das es utf8 ist, wenn die funktion utf8() an ein TextEdit nicht anwendbar ist?

:confused: :confused: :confused:

anda_skoa
22-12-2004, 12:44
ähh, sorry aber ich habe kein wort verstanden. :)


setText erwartet einen QString.
Du hast einen QString, aber aus unerklärlichen Gründen scheint dir das nicht gut genug zu sein und du rufst QString:utf8() auf um extra einen C String zu erzeugen.
Sieht für mich bischen nach einen Fehler aus.



So wie ich das verstehe (hab irgend wo gelesen), wird ein QString immer in utf8 erstellt (wenn man nichts vorgiebt).

Ein QString ist intern immer UTF-16



Also muss es am Textedit liegen.

Nein, an deinem überflüssigen utf8() Aufruf.
Der erzeugt, wie man in der Qt API Doku sehen kann, nämlich eine UTF-8 Repräsentation des QString Inhalts und UtF-8 enthält Werte, die in Latin1 nichtdarstellbare Zeichen sind und bei der Impliziten Rückkonversion in QString (weil das ja der Parameter ist den setText erwartet) entsprechend interpretiert werden.

Ciao,
_