QT中的信号和插槽

时间:2016-07-27 10:47:55

标签: c++ wpf qt

我在QT框架中的工作信号和插槽有问题。 我的插槽没有用。 这是代码。

       connect(&th,SIGNAL(change()),this,SLOT(closeWindow()));
       this->moveToThread(th);
       closeWindow();
       th.start();

“th”是来自这样一个类的var:

    class Thread : public QThread
    {
    public :
        Thread();
        bool pause,flag;
        QString URL;
        QFile *mFile;
        void run();
        void RESUME();
        void PAUSE();
        bool Check();
        bool Check2();
    signals:
        void change();
        QString myTxt;
    };

“改变”是信号

这是我的MainWindow的代码:

     namespace Ui {
     class MainWindow;
     }
     class MainWindow : public QMainWindow
     {
Q_OBJECT
     public:
         explicit MainWindow(QWidget *parent = 0);
         ~MainWindow();
        Thread th;
     private slots:
         void on_pushButton_clicked();
     private:
         Ui::MainWindow *ui;
     public slots:
         void closeWindow();
     };

,这是MainWindow的构造函数

     MainWindow::MainWindow(QWidget *parent) :
         QMainWindow(parent),
         ui(new Ui::MainWindow)
     {
         ui->setupUi(this);
         connect(&th,SIGNAL(change()),this,SLOT(closeWindow()));
         th.start();
     }

信号正常。但是Slot没有工作。 你可以指导我吗?

1 个答案:

答案 0 :(得分:1)

我认为主要问题是接收对象存在于死线程中。

您的Thread实例存在于应用程序线程中,而您的MainWindow存在于Thread实例创建的线程上。但是,当您重新实现QThread::run()时,您在此线程上没有事件循环,并且永远不会调用该插槽。

查看Qt文档以获取详细信息:

您的代码中也存在一些重大问题:

  • Thread定义中缺少Q_OBJECT宏(但您可能在复制/粘贴时将其删除,否则您将无法发出信号)。
  • 您不得在moveToThread()派生的对象上调用QWidget(例如QMainWindow)。 QWidgets必须存在于应用程序线程中。
  • 您通常无法使用moveToThread()混合并重新实现run()
    • 当使用moveToThread()时,您正在使用线程事件循环来使QObject生活在此线程上(即移动到此线程)。
    • 重新实现QThread::run()时,人们通常希望在线程上执行单个函数。这将导致创建一个线程,执行该函数并销毁线程而不运行事件循环。并且没有事件循环意味着如果QObject存在于该线程上,它将不会接收到线程间插槽调用。

注意:使用moveToThread()是使用QThread的正确/预期方式。重新实现QThread::run()会有效,可以在Qt文档中找到,但通常不建议您使用QThreadPool

更多读数:http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/