QMetaObject :: invokeMethod的slot参数

时间:2018-05-23 09:55:30

标签: c++ qt

使用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?

1 个答案:

答案 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 才有意义。