C++ 与Visual Studio 2010的Qt-Ui访问冲突
我已经设置了一个主窗口C++ 与Visual Studio 2010的Qt-Ui访问冲突,c++,qt,C++,Qt,我已经设置了一个主窗口QP\u 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(
QP\u 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
什么原因可能导致此错误?您确定没有访问
设置服务器状态标签(QString状态)
: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!");
很好用!我是Qt新手,所以不熟悉信号/插槽系统。你们能告诉我为什么信号/插槽系统更倾向于直接调用函数吗?好吧,我建议你们阅读这篇文章:它解释了很多。简而言之:如果没有特殊的线程安全机制,就无法实现独立线程之间的连接。Qt信号/插槽表示此机制。您也可以使用,但更难。请检查Qt提供的文档。有很多信息和完整的教程。如果没有它,将来会出现更多类似的错误。