Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Probleme mit QStatusBar()

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13

    Probleme mit QStatusBar()

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226

    Ich bin nicht ganz sicher

    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,
    Kirstin

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Korrekt!

    Eine weitere Möglichkeit ist in diesem Fall QSignalMapper

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13
    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:
    Code:
    main.cpp:25: undefined reference to `vtable for MyWidget'
    Später folgt noch:
    Code:
    main.cpp: more undefined references to `vtable for MyWidget' follow
    collect2: ld returned 1 exit status
    Hier ist das Codebeispiel:

    Code:
    #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

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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
    Code:
    #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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •