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);
}
vielen dank! :) Das hat funktioniert! – PDH
Oder verwenden Sie QAbstractButton :: click(), ohne die Animation. – Dennis