Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以编程方式单击QPushButton_C++_Qt - Fatal编程技术网

C++ 如何以编程方式单击QPushButton

C++ 如何以编程方式单击QPushButton,c++,qt,C++,Qt,我正在使用Qt。我在页面中有一个按钮是通过Qt Creator添加的。它连接到方法void MyPage::on_startButton_clicked() 我想以编程方式单击此按钮。我尝试了ui->startButton->clicked(),它给出 错误C2248:“QAbstractButton::clicked”:无法访问在类“QAbstractButton”中声明的受保护成员 请帮忙。谢谢 使用: RA的回答提供了这样做的方法,以便可以看到按钮被点击。如果您只希望发出信号,那么在Qt5

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

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

错误C2248:“QAbstractButton::clicked”:无法访问在类“QAbstractButton”中声明的受保护成员

请帮忙。谢谢

使用:


RA的回答提供了这样做的方法,以便可以看到按钮被点击。如果您只希望发出信号,那么在Qt5中您所做的是正确的,因为信号是公共的

您面临的错误表明您正在使用Qt4,其中的信号不是公共的。您可以通过间接调用信号来解决此问题:

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);       
}
#包括
int main(int argc,字符**argv){
bool={};
QApplication app{argc,argv};
QPushButton b{“单击我”};

QObject::connect(&b,&QPushButton::clicked,[&]{clicked=true;qDebug()如果不需要动画内容,也可以调用该方法:

on_startButton_clicked();

它在Qt 5.7.0中不起作用。@HAßdøµ它确实起作用,如果它不起作用,很多Qt都会被破坏。如果它对你不起作用,请问一个新问题。我已经包含了一个演示如何测试它的示例。或者使用QAbstractButton::click(),没有动画。作为公认解决方案的补充,只有一个实用技巧:如果通过信号和插槽调用
animateClick()
,请注意信号的参数。例如
connect(action,&QAction::triggered,button,&QPushButton::animateClick)
不起作用,因为
触发的
发送真/假,即0或1,而
动画单击接受毫秒数(您不会注意到动画的0或1毫秒)。因此,请使用lambda
连接(操作,&QAction::triggered,[button]({button->animateClick();})
你是如何为一个媒体而不是一次完整的点击做这件事的?@isaidrollupnsmokeadjunct你最好为此发布一个新问题。
on_startButton_clicked();