• 8615阅读
  • 5回复

【求助】Qthread类与QWidget类之间的通信 [复制链接]

上一主题 下一主题
离线solu
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-15
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
大家好,本人学qt时间不长,现遇到了问题,特来请教。

假设一个socket客户端程序,它具有两个基本功能:
1、它具有GUI图形界面,能够进行图形化操作。
2、有一个QThread线程,用于接收网络上传输过来的数据。

现在的要求是,当有数据传过来时,该QThread线程会对GUI图像界面进行操作。

但是我在该程序上调试了很久,渐渐发现,好像Qthread线程好像不能对QWidget对象进行操作,如果调用了QWidget对象,就会出现运行时错误。
那么我怎么实现他们之间的互动呢?一个QThread对象和QWidget对象之间怎么才能够通信呢?

谢谢!
离线dbzhang800

只看该作者 1楼 发表于: 2009-12-15
signal and slot
离线solu
只看该作者 2楼 发表于: 2009-12-15
能够说详细一点吗?怎么实现这个过程。还有那个运行时错误的问题。

class myThread: public QThread {
public:
    myThread() {
        start();
        outRun();
    }
    ~myThread() {
    }
public:
    void run() {
        QMessageBox::information(0,QString("note"),QString::fromLocal8Bit("为什么这里会运行时错误?"));  //这里会出错,为什么?
    }
    void outRun() {
        QPushButton *button=new QPushButton("hello"); //这里却不出错,为什么?
        button->show();
    }
};
[ 此帖被solu在2009-12-15 19:08重新编辑 ]
离线wanna
只看该作者 3楼 发表于: 2009-12-15
在run里行MessageBox这样有时是会出错的,Qt 的线程要求很高的,如果你想用QThread和QWidget交互,可以这样:
class myThread: public QThread {
Q_OBJECT
public:
    myThread(QWidget* wd) {
        connect(this, SIGNAL(mySignal(QString)), wd, SLOT(wdSlot(QString)));
    }
    ~myThread() {
    }
signals:
  void mySignal(QString something);
public slots:
  void someSlots();
public:
    void run() {
        ..
       if (I want to emit)
           emit mySignal(something)
  }
};
离线solu
只看该作者 4楼 发表于: 2009-12-15
引用第3楼wanna于2009-12-15 19:31发表的  :
在run里行MessageBox这样有时是会出错的,Qt 的线程要求很高的,如果你想用QThread和QWidget交互,可以这样:
class myThread: public QThread {
Q_OBJECT
public:
    myThread(QWidget* wd) {
.......


你好,我按照你的方法做了,编译和运行都没有错误,就是那个信号好像没发出去,或者没接收到。
不知道怎么回事。。。
离线galaxian
只看该作者 5楼 发表于: 2011-04-15
早期的qt QThread  不像qt4 信号不能跨线程传递,用QChannel
快速回复
限100 字节
 
上一个 下一个