信号插槽使用QThread不起作用

时间:2013-04-02 12:56:25

标签: qt signals-slots qthread

我正在使用QT框架。我一直在使用SIGNAL-SLOT。我喜欢。 :-) 但是当我使用QThread时,我无法使其工作。我总是使用“moveToThread(QThread ...)”函数创建新线程。 有什么建议吗? : - )

错误消息是:

Object :: connect:.. \ MultiMITU600 \ mainwindow.cpp中没有这样的插槽连接:: acceptNewConnection(QString,int):14 Object :: connect :(发件人姓名:'MainWindow')

我已经阅读了类似的问题,但这些问题与QThread无关。

谢谢大卫

编辑:您要求提供源代码 这是一个:

以下是代码:

包含信号和新线程的主类:

mainwindow标题:

class MainWindow : public QMainWindow
{

    …
    QThread cThread;              
    MyClass Connect;
    ...
    signals:

            void NewConnection(QString port,int current);
     …
};

上述类的构造函数:.cpp

{
    …
        Connect.moveToThread(&cThread1);
           cThread.start(); // start new thread
   ….
connect(this,SIGNAL(NewConnection(QString,int)),
            &Connect,SLOT(acceptNewConnection(QString,int))); //start measuring
…
}

包含新线程和SLOT的类 部首:

class MyClass: public QObject
{
           Q_OBJECT
….
   public slots:
            void acceptNewConnection(QString port, int current);
}

以上类的.cpp文件:

void MyClass::acceptNewConnection(QString port, int current){
    qDebug() << "This part is not be reached";

 }

最后,我在连接的类中使用emit:

void MainWindow::on_pushButton_3_clicked()
{
    …
emit NewConnection(port, 1); 
} 

1 个答案:

答案 0 :(得分:2)

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = 0);

public slots:
    void acceptConnection(QString port, int current) {
        qDebug() << "received data for port " << port;
    }    
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent) {
        myClass.moveToThread(&thread);
        thread.start();
        connect(this, SIGNAL(newConnection(QString,int)), &myClass, SLOT(acceptConnection(QString,int)));
        emit newConnection("test", 1234);
    }

signals:
    void newConnection(QString, int);

private:
    QThread thread;
    MyClass myClass;
};

输出: received data for port "test"

您的void MainWindow::on_pushButton_3_clicked()插槽是否已连接到信号?

此外,为了代码的清晰性和可读性,请保留已建立的命名约定,并对对象实例和成员对象及方法使用小写。