параметр слота для QMetaObject :: invokeMethod - PullRequest
0 голосов
/ 23 мая 2018

Игра с 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;
};

И это помогло, но почему я получаю 0 в setText значении?

1 Ответ

0 голосов
/ 23 мая 2018

Ваше событие кнопки обрабатывается циклом событий, которому принадлежит объект MainWindow, и этот же объект также содержит метод, который вы хотите вызвать (setText ()).Это означает, что вызывающий и вызываемый (или сигнал и слот) в вашем случае живут в одном потоке, и вы не должны использовать Qt :: BlockingQueuedConnection !Чтобы процитировать руководство: Использование этого типа соединения для связи между объектами в одном потоке приведет к тупикам.

Если вы намереваетесь выполнять обработку в вашем on_pushButton_clicked () после того, как метод setText () завершен, используйте взамен Qt :: DirectConnection , тогда ваш setText () будет вызываться так, как если бы он был простымфункция, и управление возвращается к вашей clicked () функции после setText () готово.

Если вы намереваетесь завершить обработку всего кода в on_pushButton_clicked () до начала обработки функции setText () , используйте Qt :: QueuedConnection .

Если вы хотите выполнить setText () параллельно on_pushButton_clicked () , затем переместите ваш метод setText () в другой объект (который принадлежит другому потоку).Только в этом сценарии Qt :: BlockingQueuedConnection имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...