QPushbutton und Textausgabe Bash

Alles rund um die Programmierung mit Qt
Antworten
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

QPushbutton und Textausgabe Bash

Beitrag von lori »

Hallo,
kann mir bitte jemand zeigen, wie ich ein Fenster mit einem QPushbutton programmiere - bei Betätigung desgleichen soll ein Text in dem Shellfenster geprinted werden, von dem das Programm gestartet wurde. Irgendwie bin ich nicht fähig so einen slot einzurichten. Danke!
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

kannst Du nicht einfach im Slot mit cout arbeiten? Oder eben printf? Das sollte doch direkt Ausgaben auf der Konsole erzeugen, in der das Programm gestartet wurde.

Gruß

Mike
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

ja, das mit printf funktioniert einwandfrei. Nur mein Problem ist momentan, dass der slot mit void button1(); der definiert wurde nicht gefunden wird oder einfach die Ausgabe bei jedem Button wenn der gedrückt wird kommt. Wahrscheinlich falsch definiert. Das Problem liegt also bei meinem Slot. Kannst Du mir bitte ein kleines Beispiel geben wie ich den Slot zu definieren habe? Kann ich die class in das main.cpp schreiben oder muss ich eine .h includen? Besten Dank!
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag von geisterfahrer »

class Irgendwas
{
Q_OBJECT

public slots:
void button1();
};

Man darf außerdem nicht das Makro Q_OBJECT innerhalb der Klassendeklaration vergessen. Dann darf die Datei allerdings nicht mehr direkt mit dem C++ Compiler bearbeitet werden, sondern muss vorher noch mit MOC (Meta-Object Compiler) die Daten bearbeiten lassen. Wie das dann genau funktioniert, weiß ich nicht, ich lasse deswegen meine Projektdatei immer mit QMAKE automatisch erstellen, damit ich mich um MOC nicht kümmern muss.
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

Du solltest die Klassen in eigenen Dateien deklarieren, da sonst der Meta Object Compiler Probleme damit hat. Genaueres weiß ich auch nicht.

Hier ein Beispiel:


/****** main.cpp ********/


#include <qapplication.h>
#include <qpushbutton.h>
#include "MyClass.h"

using namespace std;

int main( int argc, char **argv )
{
QApplication a( argc, argv );

QPushButton *button = new QPushButton("test", 0);

MyClass *myClass = new MyClass();

QObject::connect(button, SIGNAL(clicked()), myclass, SLOT(runSlot()) );

a.setMainWidget( button );
button->show();
return a.exec();
}


/****** main.cpp Ende ********/




/****** MyClass.h ********/

#include <iostream>
#include <qobject.h>

class MyClass : public QObject {
Q_OBJECT

public slots:
void runSlot() {
printf("test\n");
}
};

/****** MyClass.h Ende ********/



Gruß

Mike
TimsonC2000
Beiträge: 27
Registriert: 12. August 2004 17:57
Kontaktdaten:

Beitrag von TimsonC2000 »

besser statt cout oda printf is qWarning("text");

kommt von qapplication.h
lori
Beiträge: 16
Registriert: 9. August 2004 13:06

Beitrag von lori »

Danke Euch! - hatte einen blöden slot Fehler, den ich dank Euch gefunden habe.
qWarning gibt doch einen Text im Fenster aus, wenn ich das richtig in Erinnerung habe und nicht in der Shell von der das Programm gestartet wurde, oder? Mit printf funktioniert es jedenfalls hervorragend.
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

jein. qWarning, qDebug und qFatal senden die Meldung unter X11 nach stderr. Unter Windows werden die Meldungen laut Doku an den Debugger geschickt.

Das kannst Du auch gut nachvollziehen, wenn Du z.B. ein Programm mit folgenden Anweisungen hast:

qWarning("Dies ist eine Warnmeldung");
qDebug("Dies ist eine Debugmeldung");
printf("Dies geht an die Standardausgabe\n");

und jetzt das Programm startest mit:

./programmname 2> error.log

Durch das 2> werden die Ausgaben an stderr in die Datei error.log umgeleitet.

D.h. auf der Konsole wirst Du die Meldung "Dies geht an die Standardausgabe" sehen und in der Datei error.log werden die beiden Warn/Debug-Meldungen stehen. Rufst Du das Programm einfach so auf, wirst Du keinen Unterschied merken, da die stderr - Meldungen dann auch an stdout geschickt werden.

Selbigen Effekt erreichst Du auch mit:

fprintf(stderr, "Dies ist eine Warnmeldung\n");

Hiermit wird die Meldung an stderr geleitet, statt stdout.

Gruß

Mike
Antworten