2017-06-08 4 views
0

Ich habe ein QTimer-Objekt, das jede Sekunde eine Funktion startet. Der Timer läuft richtig, wenn ich den folgendenQTimer startet nicht beim Übergeben einer Variablen

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    // Set a Qtimer to update the OSD display every 1 second 
    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(print())); 
    timer->start(1000); 
} 

void MainWindow::print() 
{ 
    printf("hello world\n"); 
} 

Aber ich möchte eine Variable Druck() übergeben. Aber wenn ich das tue, sehe ich nie meine Druckanweisung.

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    // Set a Qtimer to update the OSD display every 1 second 
    QTimer *timer = new QTimer(this);  
    int val = 42; 
    // Now pass val to print() 
    connect(timer, SIGNAL(timeout()), this, SLOT(print(val))); 
    timer->start(1000); 
} 

void MainWindow::print(int val) 
{ 
    // I never see my print statement 
    printf("hello world, val=%d\n", val); 
} 

header.h

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 

    public slots: 
     void print(int val); 

Warum funktioniert das nicht? Was kann ich tun, um eine Variable in print() mit QTimer?

Antwort

1
connect(timer, SIGNAL(timeout()), this, SLOT(print(val))); 

Qt Signal/Slot-Verbindungen funktionieren nicht so. Der Text innerhalb der Makros SIGNAL() und SLOT() muss wörtlich die Signatur der Signal/Slot-Methode sein; Sie können dort keine Variablen oder anderen Text ohne Unterschrift einfügen.

Wenn Sie sich das stdout Ihres Programms ansehen, während es läuft, sehen Sie eine Fehlermeldung, die von connect() ausgegeben wird und Ihnen mitteilt, dass es keine Slot-Methode namens print (val) finden kann.

Wenn Sie einen separaten Wert für Ihren Slot angeben möchten, können Sie val entweder eine Membervariable Ihrer Klasse erstellen und print() die Membervariable anstelle eines Arguments anzeigen oder einen Intermediär verwenden Steckplatz:

public slots: 
    void print(int val); 
    void print42() {print(val);} 

... und dann Ihr Signal an SLOT (print42()) anschließen.

+0

Danke für die schnelle Antwort. Ich dachte mir, dass es etwas mit der Signatur zu tun hat, aber ich habe die Fehlermeldung bis jetzt nicht bemerkt. Ich werde dies als korrekt bezeichnen, sobald SO es mir erlaubt. –

+2

Um diese Antwort zu erweitern, gibt es eine Klasse namens QSignalMapper, mit der Sie einfache Zuordnungen zwischen Objekten für diesen Zweck erstellen können (d. H., Wenn ein Signal ohne Parameter ausgegeben wird). – aatwo

Verwandte Themen