使用QMetaObject::invokeMethod
方法:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setText( int value)
{
QString s = QString::number(value);
ui->textEdit->setText(s);
}
void MainWindow::on_pushButton_clicked()
{
QGenericArgument genericArg = Q_ARG(int, 321);
bool inv = QMetaObject::invokeMethod( this,"setText",Qt::BlockingQueuedConnection, genericArg);
qDebug("inv = %d\n", inv);
}
QMetaObject::invokeMethod
返回false。
我不确定插槽"setText"
。我从功能名称中取出它,我想它可能是相关的。我在哪里可以找到插槽列表?我应该为"setText"
创建特殊插槽吗?
也许这与我从同一个线程运行它的事实有关?
UPD:
我添加了公共广告位而不是公开广告:
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//void setText( int value);
private slots:
void on_pushButton_clicked();
public slots:
void setText(int value);
private:
Ui::MainWindow *ui;
};
这有帮助,但为什么我的setText
价值为0?
答案 0 :(得分:0)
您的按钮事件由拥有MainWindow对象的事件循环处理,同一对象也包含您要调用的方法(setText())。这意味着您的案例中的调用者和被调用者(或信号和插槽)位于同一个线程上,您不能使用 Qt :: BlockingQueuedConnection !引用手册:使用此连接类型在同一线程中的对象之间进行通信将导致死锁。
如果您打算在 setText()方法完成后在 on_pushButton_clicked()中进行处理,请使用 Qt :: DirectConnection 相反,那么你的 setText()将被调用,好像它是一个简单的函数,并且控件在 setText()之后返回 clicked()函数他们完成了。
如果您打算在处理 setText()函数之前完成处理 on_pushButton_clicked()中的所有代码,请使用 Qt :: QueuedConnection < /强>
如果您希望与 on_pushButton_clicked()并行执行 setText(),请将 setText()方法移动到另一个对象(这是另一个线程所拥有的)。只有在这种情况下, Qt :: BlockingQueuedConnection 才有意义。