【问题标题】:Qt - Ui access violation with Visual Studio 2010Qt - Visual Studio 2010 的 Ui 访问冲突
【发布时间】:2013-05-27 00:56:45
【问题描述】:

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

什么可能导致这个错误?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

    编辑:

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

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

    signals:
        void changeStatus(QString newStatus);
    

    NP_Qt窗口的header中写入槽定义:

    public slots:
        void statusChanged(QString newStatus);
    

    CPP文件中的连接:

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

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

    emit changeStatus("Hello from thread!");
    

    【讨论】:

    • 它工作正常!我是 Qt 的新手,所以我不熟悉 Signal/Slot 系统。你能告诉我为什么 Signal/Slot 系统比直接调用函数更受欢迎吗?
    • 好吧,我建议你阅读this 文章:它解释了很多。简而言之:如果没有特殊的线程安全机制,就无法实现单独线程之间的连接。 Qt Signals/Slots 代表了这种机制。你也可以使用QMetaObject::invokeMethod,但更难。
    • 请查看 Qt 提供的文档。有很多信息和完整的教程。没有它,你将来会犯更多这样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多