2012-11-29 45 views
1

我想创建一个应用程序,用户将点击一个QPushButton,这将触发一个辅助线程,它将向主窗口中的QListWidget添加一些文本。但由于我无法弄清楚的原因,虽然从线程到主窗口的信号被发射出去,但它永远不会到达目的地。可能因为连接失败。但是,为什么出现这种情况,这里是我的代码(我的应用程序是使用Visual Studio 2010编译):如何使用Qt中的信号和插槽进行线程间通信

mythread.h

#ifndef MY_THREAD_H 
#define MY_THREAD_H 
#include <QThread> 
#include <QString> 
class mythread:public QThread 
{ 
    Q_OBJECT 

public: 
    void setName(QString& name); 
signals: 
    void sendMsg(QString& msg); 
protected: 
    void run(); 
private: 
    QString m_name; 
    QString msg; 
}; 
#endif 

mythread.cpp

#include "mythread.h" 
void mythread::setName(QString& name) 
{ 
    m_name=name; 
} 
void mythread::run() 
{ 
    msg="Hello "+m_name; 
    emit sendMsg(msg); 
} 

mydialog.h:

#ifndef MY_DIALOG_H 
#define MY_DIALOG_H 
#include <QtGui> 
#include "mythread.h" 
class mydialog:public QDialog 
{ 
    Q_OBJECT 
public: 
    mydialog(); 
public slots: 
    void receiveMsg(QString& msg); 
    void fillList(); 
private: 
    QListWidget list1; 
    QPushButton btn1; 
    QGridLayout layout; 
    mythread thread; 
}; 
#endif 

mydialog.cpp:

#include "mydialog.h" 
mydialog::mydialog() 
{ 
    layout.addWidget(&list1,0,0); 
    btn1.setText("Find"); 
    layout.addWidget(&btn1,0,1); 
    setLayout(&layout); 
    QString myname="leonardo"; 
    thread.setName(myname); 
    connect(&btn1,SIGNAL(clicked()),this,SLOT(fillList())); 
    connect(&thread,SIGNAL(sendMsg(QString&)),this,SLOT(receiveMsg(Qstring&))); 
} 
void mydialog::fillList() 
{ 
    thread.start(); 
} 
void mydialog::receiveMsg(QString& msg) 
{ 
    list1.addItem(msg); 
} 

find.cpp:

#include <QApplication> 
#include "mydialog.h" 
int main(int argc,char* argv[]) 
{ 
    QApplication app(argc,argv); 
    mydialog window; 
    window.setWindowTitle("Find"); 
    window.show(); 
    return app.exec(); 
} 

find.pro:

TEMPLATE = app 
TARGET = 
DEPENDPATH += . 
INCLUDEPATH += . 

# Input 
HEADERS += mydialog.h mythread.h 
SOURCES += find.cpp mydialog.cpp mythread.cpp 
+1

在连接中有一个错字:'SLOT(receiveMsg(Qstring&))'应该是'SLOT(receiveMsg(QString&))'。您应该在调试器或控制台中启动您的应用程序,以查看在stdout和stderr上写入了哪些Qt –

回答

2

两件事情:

  1. 在你的第二个连接调用,Qstring必须改变,以QString
  2. Qt无法提供QString&默认情况下跨线程。有两种方法来解决这个问题:
    1. 更改信号和槽和连接,以便使QString&可使用QString而不是QString&
    2. 使用qRegisterMetaType

我还是建议你阅读

http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/

和卡里的评论

http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/#comment-7925

使用线程工作时

,虽然。

+0

我尝试添加exec()调用,但没有发生任何事情。此外,Qt文档中的Mandelbrot示例不使用exec()。 – Dragno

+0

你的第二个connect()调用返回false。我试图找出原因。 –

+0

查看我的更新回答 –

1

如果您不打算修改它,首先使用const限定符作为参数。修复连接SLOT(receiveMsg(Qstring&))中的拼写错误并将常量引用中的信号和插槽签名更改为一切正常