我设置了一个主窗口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
可能导致此错误的原因是什么?
答案 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!");