如何以编程方式单击QPushButton

时间:2014-05-13 01:01:27

标签: c++ qt

我正在使用Qt。我通过Qt Creator在页面中添加了一个按钮。它连接到方法void MyPage::on_startButton_clicked()

我想以编程方式单击此按钮。我试过了ui->startButton->clicked(),它给出了

  

错误C2248:' QAbstractButton ::点击了' :无法访问类' QAbstractButton'

中声明的受保护成员

请帮忙。谢谢!

3 个答案:

答案 0 :(得分:21)

使用QAbstractButton::animateClick()

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

答案 1 :(得分:8)

RA的回答提供了这样做的方式,以便可以看到按钮被点击。如果你想要的只是发出信号,你在Qt 5中做的是正确的,信号是公开的。

您遇到的错误表示您正在使用Qt 4,其中信号不公开。您可以通过间接调用信号来解决此问题:

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

立即调用该方法,即将调度信号并返回时间invokeMethod调用的插槽。唉,大多数代码(主要是你的代码!)都假设信号是从事件循环附近的事件处理代码发出的 - 即它不是可重入的,而不是你自己的代码。因此,您应该将信号发射推迟到事件循环:

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

以下是Qt 5.4&的完整示例。起来:

#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);       
}

答案 2 :(得分:0)

如果您不想要动画内容,您也可以调用方法:

on_startButton_clicked();