我正在使用Qt.我通过Qt Creator在页面中添加了一个按钮.它与该方法相关联void MyPage::on_startButton_clicked().
我想以编程方式单击此按钮.我试过了ui->startButton->clicked(),它给了,
错误C2248:'QAbstractButton :: clicked':无法访问类'QAbstractButton'中声明的受保护成员
请帮忙.谢谢!
RA.*_*RA. 24
用途QAbstractButton::animateClick():
QPushButton* startButton = new QPushButton("Start");
startButton->animateClick();
Run Code Online (Sandbox Code Playgroud)
RA的答案提供了这样做的方式,以便可以看到按钮被点击.如果您想要的只是发出信号,那么您在Qt 5中所做的是正确的,其中信号是公开的.
您遇到的错误表明您正在使用Qt 4,其中信号不公开.您可以通过间接调用信号来解决此问题:
QMetaObject::invokeMethod(ui->startButton, "clicked");
Run Code Online (Sandbox Code Playgroud)
这会立即调用该方法,即调度信号并invokeMethod返回时间调用的插槽.唉,大多数代码(主要是你的代码!)都假定信号是从事件处理代码发出的,靠近事件循环 - 即它不是可重入的,而不是来自你自己的代码.因此,您应该将信号发射推迟到事件循环:
// Qt 5.4 & up
QTimer::singleShot(0, ui->startButton, [this]{ ui->startButton->clicked(); });
// Qt 4/5
QTimer::singleShot(0, ui->startButton, "clicked");
Run Code Online (Sandbox Code Playgroud)
以下是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);
}
Run Code Online (Sandbox Code Playgroud)