2016-07-27 97 views
-1

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

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

“日” 是这样的类变种:

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; 
    }; 

“变” 是信号

,这里是我的主窗口的代码:

 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(); 
    } 

信号正常。但插槽不工作。 你能指导我吗?

+0

我们不能在你的代码中的信号发射看到(我们甚至看不到*如果*它发出的)。您的第一个片段无法工作:变量th是一个对象,moveToThread将一个指针作为参数。请提供[MCVE](https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjt8d_-vJPOAhVPahoKHdeFBPUQFggeMAA&url=http%3A%2F%2Fstackoverflow.com %2Fhelp%2Fmcve与USG = AFQjCNEkKReghNZHBJSaky_hwPskMmG0ww&SIG2 = qJFt1v76F13Ikk_8pOIvMQ) – wasthishelpful

+0

我发送的信号,现在你@wasthishelpful – sass

+0

时是发出它的信号的工作(我的测试,并写一些代码到它,并且他们跑酷)@wasthishelpful – sass

回答

1

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

您的Thread实例位于应用程序线程上,而您的MainWindow位于您的Thread实例创建的线程上。但是,如您已重新实现QThread::run(),则此线程上没有事件循环,并且该插槽永远不会被调用。有关详细信息,

检查Qt文档:


你也需要在你的代码中的一些重大问题:

  • 缺少Q_OBJEC T宏定义在Thread定义中(但您可能在复制/粘贴时删除了它,否则您将无法发出信号)。
  • 您不得致电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/