将QString传递到插槽时发生访问冲突
Access Violation passing QString to slot
这与我昨天发布的一个问题类似,但我能够进一步隔离问题,所以我宁愿问一个新问题。
我有一个QThread,它会发出一个信号并将一个QString传递到一个插槽。这就是我连接信号和插槽的方式:
connect(reader, SIGNAL(error(QString)), this, SLOT(threadError(QString)))
这就是信号的发射方式:
void Reader::read() {
emit error("No new data for 500 samples");
while (1) {
}
}
这就是插槽实现:
void MainWindow::threadError(const QString msg) {
std::string st = msg.toStdString();
int i = 0; //never reached
}
即使线程继续运行,访问msg QString也会导致访问冲突异常。我看了很多例子,找不到不同的方法。我做错了什么?
更新:声明:
class Reader : public QObject {
Q_OBJECT
public:
Reader();
~Reader();
public slots:
void read();
signals:
void error(QString err);
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent, const std::string &config_file, const
~MainWindow();
private slots:
void threadError(QString msg);
}
我看不出您的代码有明显的问题。如果您在代码中使用C++11和旧的Qt库,您可以尝试升级到Qt 4.8.7或Qt 5.x。
线程之间的信号槽连接是排队的,默认情况下不是直接的。我认为由于while(1){}这个问题即将到来。尝试在无限循环中提供睡眠,以便处理事件循环。
尝试进行此更改。连接:
connect(reader, SIGNAL(error(QString*)), this, SLOT(threadError(QString*)));
发射信号:
emit error(new QString("No new data for 500 samples"));
插槽:
void MainWindow::threadError(QString* msg) {
std::string st = msg->toStdString();
delete msg;
int i = 0;
.........
}
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 中动态二维数组的访问冲突
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- 从 QWidgetList 访问 QWidget 子插槽/信号 (QList<QWidget*>)
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 如何访问QHeaderView::section插入插槽
- 将QString传递到插槽时发生访问冲突
- 从插槽访问中央小部件时出现Segfault
- Qt:访问uitools/uiloader生成的小部件的信号/插槽
- QObject信号和插槽未访问功能
- 插槽后Qt访问冲突0xC0000005