2013-05-27 41 views
2

我设置了一个主窗口QP_Qt与标签上它命名为serverStatusLabel:编译过程中出现的Qt - 用户界面访问冲突与Visual Studio 2010

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 

什么可能导致这个错误?

回答

3

您确定您不访问指针setServerStatusLabel(QString status)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!"); 
+0

它工作正常!我是Qt新手,所以我不熟悉Signal/Slot系统。您能否告诉我为什么Signal/Slot系统更喜欢直接调用函数? – CDT

+0

那么,我会建议你阅读[this](http://qt-project.org/doc/qt-4.8/signalsandslots.html)文章:它解释了很多。简而言之:无法实现独立线程之间的连接,而无需特殊的线程安全机制。 Qt信号/插槽表示这种机制。你也可以使用['QMetaObject :: invokeMethod'](http://stackoverflow.com/questions/1144240/qt-how-to-call-slot-from-custom-c-code-running-in-a-different线程),但它更难。 – ahawkthomas

+0

真的很感激! – CDT