Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit QStatusBar()



proggy
29-07-2005, 12:22
Hi!
Ich hab ein Problem:
Ich würde gerne nach Klicken auf einen Button eine Meldung in der Statusleiste ausgeben.
QStatusBar::showMessage() ist für die Ausgabe einer Meldung in der Statusleiste verantwortlich. Direkt aufgerufen, funktioniert sie auch. Sobald man sie als SLOT in in die Funktion connect() einfügt, zeigt sich die Statusleiste leer.
Woran könnte das liegen? Hatte jemand ein ähnliches Problem? Hier ist der Code:


....
QPushButton *quit = new QPushButton("Quit");
statusBar = new QStatusBar(parent);
//statusBar->showMessage("wer");

connect(quit, SIGNAL(clicked()), parent, SLOT(showStatus("Auf quit geklickt"))

);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(quit);
layout->addWidget(statusBar);
setLayout(layout);
...


Danke schon mal!

Grüße
proggy

Kirsche
29-07-2005, 18:01
Hallo proggy,

ich bin nicht ganz sicher, aber es könnte daran liegen, dass man signals und slots so nicht verbindet.

Du hast geschrieben:
connect(quit, SIGNAL(clicked()), parent, SLOT(showStatus("Auf quit geklickt"))

Das Signal clicked() hat kein Argument zum Übergeben, der Slot showStatus hat einen String bzw. evt. auch QString. Das passt also nicht zusammen. Allerdings kannst du (fast) schreiben, was du willst, du bekommst bei falschen Verknüpfungen fast nie eine Fehlermeldung.

Ich würde eine Funktion schreiben, die den Text in die Statusbar schreibt, z.B. so:

void myClass::slotShowStatus()
{
showStatus("Auf quit geklickt"); // falls die Statusbar hier bekannt ist
}

das connect müsste dann ungefähr so aussehen:
connect(quit, SIGNAL(clicked()), parent, SLOT( slotShowStatus()))
Ich lasse meine Slot-Namen immer mit slot beginnen, damit ich immer genau weiß, ob eine Funktion ein Slot ist oder nicht. Bei diesem connect sind beide Argumentlisten leer und passen somit zusammen. Ansonsten müsste das Signal clicked() einen QString übergeben (was es aber nicht macht bzw. machen kann).

Ansonsten kannst du dein komplettes connect mit if() umschließen und dann eine Meldung (mit QMessageBox) ausgeben, z.B. "connect klappt". Falls diese Meldung nicht ausgegeben wird, wurde auch kein korrektes connect durchgeführt.

Schöne Grüße,

anda_skoa
01-08-2005, 13:13
Korrekt!

Eine weitere Möglichkeit ist in diesem Fall QSignalMapper

Ciao,
_

proggy
02-08-2005, 13:29
Hi!
Danke für die Hilfe!

Nun wollte ich mir selbst einen Slot basteln.
Nach Klicken auf button1 soll lineEdit eine 2 ausgeben. Jedoch liefert mir der Linker folgenden Fehler:


main.cpp:25: undefined reference to `vtable for MyWidget'

Später folgt noch:


main.cpp: more undefined references to `vtable for MyWidget' follow
collect2: ld returned 1 exit status

Hier ist das Codebeispiel:



#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <Qt3Support/Q3ListBoxItem>
#include <Qt3Support/Q3ListBox>

class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
void handleSlotsSignals();
public slots:
void Slot_setText()
{
lineEdit->setText("2");
}
private:
QLineEdit *lineEdit;
QPushButton *button1;
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
button1 = new QPushButton("Write Text");
lineEdit = new QLineEdit;
lineEdit->setText(QString("1"));
//handleSlotsSignals();
QObject::connect( button1, SIGNAL( clicked() ), parent, SLOT( Slot_setText() ) );
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(lineEdit);
setLayout(layout);
}

void MyWidget::handleSlotsSignals()
{
//QObject::connect( button1, SIGNAL( clicked() ), parent, SLOT( Slot_setText() ) ); // Fehler!!
//QObject::connect( button1, SIGNAL( clicked() ), lineEdit, SLOT( clear() ) ); OK!!
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}


Würde mich freuen, wenn ihr mir helfen könntet! :)
Grüße proggy

anda_skoa
02-08-2005, 16:43
moc wurde nicht aufgerufen.

Wenn du qmake benutz sollte es reichen eine gleichnamige .moc Datei am Ende zu inkludieren und das Makefile neu erzeugen zu lassen, also wenn zB die Datei main.cpp heißt am Ende ein


#include "main.moc"

anhängen, oder gleich die Klasse mit dem Q_OBJECT macro in eine Header und eine .cpp Datei auslagern, dann weiß qmake auch was zu tun ist.

Ciao,
_