如何将信号从 qconcurrent 线程连接到共享一个字符串的 gui 线程

问题描述 投票:0回答:1

我正在尝试使用其他线程信息(QString)更新 gui 标签。

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public Q_SLOTS:
    void sl_appendInfo(QString p_text);

private:
    Ui::MainWindow *ui;
    QFuture<void> m_thread;
    QFuture<void> m_engine;
    engine* m_object;
};

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    m_object = new engine();

    qRegisterMetaType<QString>();
    bool success = connect(this->m_object, SIGNAL(engine::sig_appendInfo(QString)), this, SLOT(sl_appendInfo(QString)), Qt::QueuedConnection);

    if(!success)
    {
        qDebug("success failed");
    }

    m_engine = QtConcurrent::run(this->m_object, &engine::eventLoop);
}

//slot declaration in mainwindow.cpp
void MainWindow::sl_appendInfo(QString p_text)
{
    ui->label->setText(p_text.toLocal8Bit().constData());
}


class engine : public QObject
{

    Q_OBJECT

public:
    engine();
    ~engine();
    void eventLoop();

Q_SIGNALS:
    void sig_exitengine(void);
    void sig_appendInfo(QString p_text);
};

void engine::eventLoop()
{
    int state = false;

    while(true)
    {
        state = getNextEvent(m_event);

        if (state == true)
        {
                sig_appendInfo("information for gui: we handled a new event !");
        state=false;
        }
        QThread::msleep(1000);
    }
}

现在我使用此链接:我的信号/槽连接不起作用来构建我自己的代码,但它不起作用,连接失败......我可以提供一些帮助吗?

谢谢你

c++ multithreading qt
1个回答
0
投票

您的

connect
语法错误。您不应在
SIGNAL
宏中包含类名称。如果你使用旧的语法,它应该是:

bool success = connect(m_object, SIGNAL(sig_appendInfo(QString)), this, SLOT(sl_appendInfo(QString)), Qt::QueuedConnection);

或者如果您想使用新语法:

bool success = connect(m_object, &engine::sig_appendInfo, this, &MainWindow::sl_appendInfo, Qt::QueuedConnection);
© www.soinside.com 2019 - 2024. All rights reserved.