2

我设置了一个主窗口QP_Qt,上面有一个名为serverStatusLabel

class NP_Qt : public QMainWindow
{
    Q_OBJECT

public:
    NP_Qt(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~NP_Qt();
    void setServerStatusLabel(QString status);
    void setClientStatusLabel(QString status);

private:
    Ui::NP_QtClass ui;
}

void NP_Qt::setServerStatusLabel(QString status)
{
    ui.TCPServerStatusLabel->setText(status);
}

编译过程中没有发生错误。在运行时,当setServerStatusLabel被另一个类调用时:</p>

void ServerListenThread::run()
{
    if(! tcpServer.listen(QHostAddress::LocalHost, portNumber)) {
        window->setServerStatusLabel("Failed to listen on this port");
    } else {
        window->setServerStatusLabel("Listening");
    }
}

发生了错误:

Unhandled exception at 0x771115de of SP_Qt.exe: 0xC0000005 : access violation at 0xccccce2c  

什么可能导致此错误?

4

1 回答 1

3

您确定不访问 : 中的指针setServerStatusLabel(QString status)ui.TCPServerStatusLabel?尝试将其更改为ui->TCPServerStatusLabel.

编辑:

我还建议您使用 Qt Signal/Slot 系统,而不是直接从其他线程调用函数。像这样的东西:

在线程的头文件中写入信号定义:

signals:
    void changeStatus(QString newStatus);

NP_Qt窗口中,在标题中写入插槽定义:

public slots:
    void statusChanged(QString newStatus);

和 CPP 文件中的连接:

connect (myThread, SIGNAL(changeStatus(QString)),
         this, SLOT(statusChanged(QString)));

最后,在你的线程中发出信号:

emit changeStatus("Hello from thread!");
于 2013-05-27T00:59:40.197 回答