2014-05-13 11 views
7

Ich verwende Qt. Ich habe eine Schaltfläche auf der Seite, die über den Qt Creator hinzugefügt wurde. Es ist mit der Methode void MyPage::on_startButton_clicked() verbunden.Wie programmgesteuert auf einen QPushButton klicken

Ich möchte programmgesteuert auf diese Schaltfläche klicken. Ich habe versucht, ui->startButton->clicked(), es gibt,

Fehler C2248: 'QAbstractButton :: geklickt': kann nicht auf geschütztes Mitglied in der Klasse deklariert 'QAbstractButton'

Bitte helfen. Vielen Dank!

Antwort

16

Verwendung QAbstractButton::animateClick():

QPushButton* startButton = new QPushButton("Start"); 
startButton->animateClick(); 
+0

vielen dank! :) Das hat funktioniert! – PDH

+1

Oder verwenden Sie QAbstractButton :: click(), ohne die Animation. – Dennis

7

RA Antwort bietet die Möglichkeit, es zu tun, so dass es sichtbar ist, dass die Schaltfläche geklickt wurde. Wenn Sie nur das Signal aussenden möchten, ist das, was Sie tun, in Qt 5 korrekt, wo die Signale öffentlich sind.

Der angezeigte Fehler weist darauf hin, dass Sie Qt 4 verwenden, bei dem die Signale nicht öffentlich sind. Sie können indirekt durch den Aufruf das Signal dieses Problem umgehen:

QMetaObject::invokeMethod(ui->startButton, "clicked"); 

Dies ruft die Methode sofort, das heißt das Signal ausgelöst wird, und die von der Zeit invokeMethod kehrt genannt Slots. Leider setzt der meiste Code (meistens Ihr Code!) Voraus, dass das Signal von Ereignisverarbeitungscode in der Nähe der Ereignisschleife ausgegeben wird - d. H. Es ist nicht wiedereintretend, anstatt von Ihrem eigenen Code. Daher sollten Sie die Signalabgabe an die Ereignisschleife aufschieben:

// Qt 5.4 & up 
QTimer::singleShot(0, ui->startButton, [this]{ ui->startButton->clicked(); }); 
// Qt 4/5 
QTimer::singleShot(0, ui->startButton, "clicked"); 

Hier finden Sie ein vollständiges Beispiel für Qt 5.4 & up:

#include <QtWidgets> 

int main(int argc, char ** argv) { 
    bool clicked = {}; 
    QApplication app{argc, argv}; 
    QPushButton b{"Click Me"}; 
    QObject::connect(&b, &QPushButton::clicked, [&]{ clicked = true; qDebug() << "clicked"; }); 
    Q_ASSERT(!clicked); 
    b.clicked(); // immediate call 
    Q_ASSERT(clicked); 
    clicked = {}; 
    // will be invoked second - i.e. in connect order 
    QObject::connect(&b, &QPushButton::clicked, &app, &QApplication::quit); 
    QTimer::singleShot(0, &b, [&]{ b.clicked(); }); // deferred call 
    Q_ASSERT(!clicked); 
    app.exec(); 
    Q_ASSERT(clicked);  
} 
+0

In Qt 5.7.0 wurde nicht gewunken. –

+0

@ HAßdøμ Es funktioniert sicherlich, eine Menge Qt wäre kaputt, wenn es nicht wäre. Wenn es für Sie nicht funktioniert, stellen Sie eine neue Frage. Ich habe ein Beispiel hinzugefügt, das zeigt, wie man es testet. –

0

Wenn Sie die Animation nicht stopfen wollen, können Sie auch rufen sie einfach die methode:

on_startButton_clicked(); 
Verwandte Themen