//MainWindow.cpp
void MainWindow::threadedFunction()
{
myDialog = new MyDialogs(list,processList,this);
myDialog->show();
}
void MainWindow::createNewDialog()
{
getProcesses();
//threadedFunction(); //This works fine.
std::thread tx = std::thread(&MainWindow::threadedFunction,this);
tx.join();
}
//MyDialog.cpp
MyDialogs::MyDialogs(QList<int> lists,QStringList list,QObject *parent):QDialog(0)
{
QVBoxLayout *toplay = new QVBoxLayout(this);
listWidget = new QListWidget(this);
x<<list;
l<<lists;
listWidget->addItems(x);
toplay->addWidget(listWidget);
connect(listWidget,SIGNAL(doubleClicked(QModelIndex)),
this,SLOT(getProcessString(QModelIndex)));
}
void MyDialogs::getProcessString(QModelIndex index)
{
selectedProcessString = index.data().toString();
rowIndex = index.row();
}
已在专业档案中设定。
CONFIG += c++11
当我直接调用threadedFunction时,代码工作正常。 但是上面提到的代码给了我运行时error。 如果我在threadedFunction中只使用qDebug语句并删除myDialog代码,那么即使使用线程,代码也能正常运行。问题是什么?我使用的是Qt5和MingW 4.9.1 32bit。我没有安装visual studio。
答案 0 :(得分:2)
问题是您正在尝试在GUI线程之外创建UI对象。我假设您的main
函数实例化一个QApplication
对象,它启动您的事件循环。这个线程是你唯一的GUI线程。我猜你的GUI线程是创建试图实例化QListWidget
的线程的线程。
如果我的假设是正确的,那么你需要在main / GUI线程中创建QListWidget
,然后调用你的线程函数。我不能说你应该在你的线程函数中做什么,因为我不确定你想做什么,但有多种方法可以处理它。
您可能需要查看QThread
。该类允许您使用信号和插槽,这可能使您更容易。您可以使用传统的线程构造(例如,互斥,等待条件等)和共享状态。还有一些方法可以发布通过消息循环的事件(即发送回主/ GUI线程)。