Qt - 使用Visual Studio 2010进行Ui访问冲突

时间:2013-05-27 00:56:46

标签: c++ qt

我设置了一个主窗口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时:

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  

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

1 个答案:

答案 0 :(得分: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!");