2013-05-27 40 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