• 3582阅读
  • 2回复

跨线程连接信号和槽 [复制链接]

上一主题 下一主题
离线好汉饶命
 
只看楼主 倒序阅读 楼主  发表于: 2012-03-27
class Object : public QObject
{
    Q_OBJECT
public :
    Object()
    {

    }

    void objectSetNewText(QString &text)
    {
        m_cTextEdit.setNewText(text);
    }

signals:
    void signalThreadFinish(QList<Sentence> list);

    public slots:
        void slotThreadStart()
        {
            m_cTextEdit.detectSentence(m_sentList);
            emit signalThreadFinish(m_sentList);//主线程接受这个信号
        }

private :
    CustomTextEditor m_cTextEdit;
    QList<Sentence> m_sentList;
};


在主线程中C/C++ code
    // Prepare sentences.
    QString strText = m_textEdit.toPlainText();
    clear();
    m_textEdit.setNewText(strText);
         Object obj;
         QThread thread;
    obj.objectSetNewText(strText);
    obj.moveToThread(&thread);
QObject::connect(this, SIGNAL(signalThreadStart()), &obj, SLOT(slotThreadStart()));
QObject::connect(&obj, SIGNAL(signalThreadFinish(QList<Sentence>)), this, SLOT(slotThreadFinish(QList<Sentence>),Qt::QueuedConnection);//这样连接,槽函数不执行
    thread.start();
    emit signalThreadStart();



主线程中的槽函数C/C++ codevoid MainWindow::slotThreadFinish(QList<Sentence> list)
{
    m_sentList = list;
          ...//操作UI
}


现在的情况是Object类的槽函数是在次线程里运行的,结束的时候发射一个信号,我想让主线程中的槽函数和这个信号关联,让这个槽函数在主线程中运行,因为这个槽函数要操作UI,由于信号是从次线程中发射的,而槽函数是在住线程里运行,所以我觉得是队列连接,但是现在的问题是,队列连接不成功,它没有执行,但是如果强制为直接连接,他是执行的,但是这样槽函数就会在次线程里运行了,由于该槽函数操作了UI,所以就报错了。不知道大家能不能理解我表达的意思,坐等高手解答吧……

简单的说就是,信号从次线程中发射,想让槽函数(在主线程中实现的)在主线程里执行,但是队列连接不起作用
离线jdwx

只看该作者 1楼 发表于: 2012-03-27
回 楼主(好汉饶命) 的帖子
又到这里来了!跟你说了嘛,先把类分成.h和.cpp再说。
原因就不说了,用Qt就要按照Qt的要求来写代码。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dbzhang800

只看该作者 2楼 发表于: 2012-03-28
队列连接,所有的参数必须先在meta-object系统中注册!!

“QList<Sentence>”

具体看manual

题外:首先,你这个程序运行时,控制台应该有警告,告诉你漏掉了什么。其次,没把握的话,最后记得判断connect的返回值,比如你这个,返回false,而不是你期待的true
快速回复
限100 字节
 
上一个 下一个