C++ 与Visual Studio 2010的Qt-Ui访问冲突

C++ 与Visual Studio 2010的Qt-Ui访问冲突,c++,qt,C++,Qt,我已经设置了一个主窗口QP\u 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(

我已经设置了一个主窗口
QP\u 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
时:

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  

什么原因可能导致此错误?

您确定没有访问
设置服务器状态标签(QString状态)
ui.TCPServerStatusLabel
中的指针吗?尝试将其更改为
ui->TCPServerStatusLabel

编辑:

我还建议您使用Qt信号/插槽系统,而不是直接从其他线程调用函数。大概是这样的:

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

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!");

很好用!我是Qt新手,所以不熟悉信号/插槽系统。你们能告诉我为什么信号/插槽系统更倾向于直接调用函数吗?好吧,我建议你们阅读这篇文章:它解释了很多。简而言之:如果没有特殊的线程安全机制,就无法实现独立线程之间的连接。Qt信号/插槽表示此机制。您也可以使用,但更难。请检查Qt提供的文档。有很多信息和完整的教程。如果没有它,将来会出现更多类似的错误。