• 6948阅读
  • 10回复

[提问]如何为Qt线程自定义信号 [复制链接]

上一主题 下一主题
离线strelz
 
只看楼主 倒序阅读 楼主  发表于: 2013-02-19
请教一下,我想在一个线程类Thread(继承自QThread类)中自定义一个信号来与其他线程联络,可是发射信号后,在编译时会产生unresolved external exprexssion的错误,意思是没有识别我为这个线程自定义的信号,而且显示没有找到thread.obj(thread是Thread类的一个对象)文件。请问,为线程自定义信号需要添加什么特殊的头文件么?
离线pxiao_xiao

只看该作者 1楼 发表于: 2013-02-20
换个方式试试
用QObject object.moveToThread(thread)
把信号和槽都定义到object里
离线realfan

只看该作者 2楼 发表于: 2013-02-20
你把Thread类定义贴上来,看看。
离线jdwx

只看该作者 3楼 发表于: 2013-02-20
这个不应该出错。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线strelz
只看该作者 4楼 发表于: 2013-02-20
  1. //********************mythread.h********************
  2. #ifndef MYTHREAD_H
  3. #define MYTHREAD_H
  4. #include <QtGui>
  5. #include "QThread"
  6. class MyThread : public QThread
  7. {
  8. public:
  9.     MyThread();
  10. signals:
  11.     void sendTest(int a);
  12. protected :
  13.     void run();
  14. };
  15. #endif // MYTHREAD_H
  16. //********************mythread.cpp********************
  17. #include "mythread.h"
  18. MyThread::MyThread()
  19. {
  20. }
  21. void MyThread::run()
  22. {
  23.     int i;
  24.     for(i = 0; i < 300; i++)
  25.     {
  26.         emit sendTest(i);
  27.         msleep(1000);
  28.     }
  29. }
  30. //********************mainwindow.h*******************
  31. #ifndef MAINWINDOW_H
  32. #define MAINWINDOW_H
  33. #include "mythread.h"
  34. #include <QMainWindow>
  35. namespace Ui {
  36. class MainWindow;
  37. }
  38. class MainWindow : public QMainWindow
  39. {
  40.     Q_OBJECT
  41.     
  42. public:
  43.     explicit MainWindow(QWidget *parent = 0);
  44.     ~MainWindow();
  45.     MyThread * pMyThread;
  46. public slots:
  47.     void SetValue(int value);
  48. private:
  49.     Ui::MainWindow *ui;
  50. };
  51. #endif // MAINWINDOW_H
  52. //**********************mainwindow.cpp**************
  53. #include "mainwindow.h"
  54. #include "ui_mainwindow.h"
  55. #include "QDebug"
  56. MainWindow::MainWindow(QWidget *parent) :
  57.     QMainWindow(parent),
  58.     ui(new Ui::MainWindow)
  59. {
  60.     ui->setupUi(this);
  61.     connect(this->pMyThread,SIGNAL(sendTest(int)),this,SLOT(SetValue(int)));
  62. }
  63. MainWindow::~MainWindow()
  64. {
  65.     delete ui;
  66. }
  67. void MainWindow::SetValue(int value)
  68. {
  69.     qDebug() << value<<endl;
  70. }
  71. //***************main.cpp******************
  72. #include <QtGui/QApplication>
  73. #include "mainwindow.h"
  74. int main(int argc, char *argv[])
  75. {
  76.     QApplication a(argc, argv);
  77.     MainWindow w;
  78.     w.show();
  79.     w.pMyThread->start();
  80.     
  81.     return a.exec();
  82. }

离线strelz
只看该作者 5楼 发表于: 2013-02-20
报告这样两条错误:
1.
mythread.obj:-1: error: LNK2019: unresolved external symbol "protected: void __thiscall MyThread::sendTest(int)" (?sendTest@MyThread@@IAEXH@Z) referenced in function "protected: virtual void __thiscall MyThread::run(void)" (?run@MyThread@@MAEXXZ)
2.
debug\ThreadProj.exe:-1: error: LNK1120: 1 unresolved externals
离线realfan

只看该作者 6楼 发表于: 2013-02-20
回 5楼(strelz) 的帖子
MyThread类定义,少了Q_OBJECT

class MyThread : public QThread
{
        Q_OBJECT
public:
        ......

}
加上Q_OBJECT试试
离线strelz
只看该作者 7楼 发表于: 2013-02-20
我把mythtread.h加入 Q_OBJECT,可还是报错

  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QtGui>
  4. #include "QThread"
  5. class MyThread : public QThread
  6. {
  7.     Q_OBJECT
  8. public:
  9.     MyThread();
  10. signals:
  11.     void sendTest(int a);
  12. protected :
  13.     void run();
  14. };
  15. #endif // MYTHREAD_H

离线strelz
只看该作者 8楼 发表于: 2013-02-20
报错的后面显示File not found : mythread.obj
离线realfan

只看该作者 9楼 发表于: 2013-02-20
回 8楼(strelz) 的帖子
你MyThread * pMyThread;
只定义了一个指针,并没有创建MyThread实例,pMyThread是个野指针

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   pMyThread = new MyThread();
    connect(this->pMyThread,SIGNAL(sendTest(int)),this,SLOT(SetValue(int)));
}
离线strelz
只看该作者 10楼 发表于: 2013-02-20
嗯,这点没有注意到。现在程序可以运行了,能够识别线程自定义的信号。多谢啦!
快速回复
限100 字节
 
上一个 下一个