Frage zu connect / qt-Bibliothek

C-H

Erfahrenes Mitglied
Hi!

Ich steige gerade in C++ und die qt-Bibliothek ein und arbeite mich gerade durch die Tutorials. Zu den der Funktion connect hätte ich da eine Frage. Die Buttons pbtn_dec, pbtn_bin, usw. in folgendem Code funktionieren nicht:

Code:
class MyWidget : public QVBox
{
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
};
 
MyWidget::MyWidget( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) );
    connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
    QLCDNumber *lcd  = new QLCDNumber( 8, this, "lcd" );
 //lcd->setMode(QLCDNumber::Bin);
    QSlider * slider = new QSlider( Horizontal, this, "slider" );
    slider->setRange( 0, 99 );
    slider->setValue( 0 );
    connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
 QPushButton *pbtn_dec = new QPushButton( "DEC", this, "dec" );
 QPushButton *pbtn_hex = new QPushButton( "HEX", this, "hex" );
 QPushButton *pbtn_bin = new QPushButton( "BIN", this, "bin" );
 QPushButton *pbtn_oct = new QPushButton( "OCT", this, "oct" );
 pbtn_dec->setFont( QFont( "Times", 20, QFont::Bold ) );
 pbtn_hex->setFont( QFont( "Times", 18, QFont::Bold ) );
 pbtn_bin->setFont( QFont( "Times", 18, QFont::Bold ) );
 pbtn_oct->setFont( QFont( "Times", 18, QFont::Bold ) );
 connect( pbtn_dec, SIGNAL(clicked()), lcd, SLOT(setMode(QLCDNumber::DEC)) );
 connect( pbtn_hex, SIGNAL(clicked()), lcd, SLOT(setMode(QLCDNumber::HEX)) );
 connect( pbtn_bin, SIGNAL(clicked()), lcd, SLOT(setMode(QLCDNumber::BIN)) );
 connect( pbtn_oct, SIGNAL(clicked()), lcd, SLOT(setMode(QLCDNumber::OCT)) );
}
 
int main( int argc, char **argv )
{
    QApplication a( argc, argv );
    MyWidget w;
    a.setMainWidget( &w );
    w.show();
    return a.exec();
}

Bsp1:
Code:
connect( object1, SIGNAL(event()), object2, SLOT(method()) );

Wenn ich das richtig verstanden habe, wird bei connect die Methode "method()" des Objekts "object2" aufgerufen, wenn das Event "event()" des Objekt "objects1()" eintritt (Beispiel 1).

Wieso das hier funktioniert, kann ich mir erklären:
Code:
connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );

Wieso dann aber das hier nicht funktioniert, kann ich mir nicht erklären: :(
Code:
connect( pbtn_dec, SIGNAL(clicked()), lcd, SLOT(setMode(QLCDNumber::DEC)) );

Hab' ich da etwas völlig falsch verstanden? :confused:
 
Hallo,

Wenn ich das richtig verstanden habe, wird bei connect die Methode "method()" des Objekts "object2" aufgerufen, wenn das Event "event()" des Objekt "objects1()" eintritt (Beispiel 1).

Wie sollte die connect Methode etwas aufrufen zu einem Zeitpunkt wo sie gar nicht mehr läuft? Der event tritt ja für gewöhnlich viel später auf, da befindest du dich lange nicht mehr in der connect Methode. Das was sie macht ist eine Funktion für dein Ereigniss bzw dein Signal zu registrieren, das ist ein Unterschied! Sprich du musst da die Methodensignatur angeben und nicht den Aufruf:

connect( pbtn_dec, SIGNAL(clicked()), lcd, SLOT(setMode(int)) );

Somit wird die Methode setMode vom qt Eventloop aufgerufen wenn das Ereigniss clicked() eingetreten ist, und du weißt das der Methode beim Aufruf einen Parameter vom Typ int übergeben wird...

Für ein etwas praxisnaheres Beispiel siehe dort:
http://www.tutorials.de/forum/c-c/263284-c-qt-signal-bei-auswahl-eines-tabs.html

Gruß,
RedWing
 
:eek: Ok, kapiert (ist ja eigentlich auch logisch).

Wie übergebe ich der Methode dann aber Parameter? Z.B. welcher Button gedrückt wurde. Wenn ich z.B. 4 Buttons habe und alle sollen die gleiche Methode aufrufen, nur mit unterschiedlichen Parametern - wie ist da die vorgehensweise? Muss ich für jeden Button eine Methode schreiben, die dann die Methode die ich eigentlich verwenden möchte mit den verschiedenen Parametern aufruft? Kann sein, daß die Frage blöd ist - aber irgendwie stehe ich auf'm Schlauch. :confused:
 
Hallo,

zum managen von mehreren Buttons gibts in qt die QButtonGroup welche dir auch ein signal Namens void buttonClicked ( int id ) zur Verfügung stellt.

Schau mal hier:
C++:
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtGui/QButtonGroup>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
#include <QtGui/QStatusBar>

class QButtonsExample : public QMainWindow {
    Q_OBJECT

    private:
        QStatusBar* status;
    public:
        QButtonsExample(int nr_of_buttons) {
            status = new QStatusBar();
            QButtonGroup *group = new QButtonGroup();
            QPushButton* buttons[nr_of_buttons];
            QVBoxLayout* layout= new QVBoxLayout();

            for (int i = 0; i < nr_of_buttons; i++) {
                QPushButton* button = new QPushButton(QString("Button ") +
                                                      QString().setNum(i + 1));
                group->addButton(button, i);
                layout->addWidget(button);
            }

            connect(group, SIGNAL(buttonClicked(int)),
                    this, SLOT(buttonClicked(int)));

            QWidget* central_widget = new QWidget();
            central_widget->setLayout(layout);
            setCentralWidget(central_widget);
            setStatusBar(status);
        }

    public slots:
        void buttonClicked(int id) {
            status->showMessage(QString("Button ") +
                                QString().setNum(id + 1) +
                                " pressed!");
        }

};

int main(int argc, char** argv) {
    QApplication app(argc, argv);
    QButtonsExample ex(10);
    ex.show();
    return app.exec();
}

Gruß,
RedWing
 
Zurück