QThread,在线程上创建GUI小部件元素

时间:2013-07-04 08:52:26

标签: c++ multithreading qt qthread

我已经尝试了一段时间,似乎并不常见,因为我没有找到太多信息。

我有一个QTree,我把项目放在我的项目上,我在第一列上有一个复选框。

问题:Checkbox没有经过优化以便被视为如此,并且只要有多个元素就会花费很长时间。

所以我在放入列表之前使用线程来创建复选框,但似乎无法在GUI线程上找回复选框。

void CheckItemThread::run()
{
    setPriority(QThread::IdlePriority);
    QCheckBox     *m_check;
    m_check = new QCheckBox();
    emit done(m_check);
}

我的主要话题:

myCheckItem::myCheckItem(QTreeWidget *parent, QStringList columnNames ):
  myWidgetItem(parent)
{
  m_parent = parent;
  m_columnNames = columnNames;

    connect(&TheThread,SIGNAL(done(QCheckBox *)), this, SLOT(retThread(QCheckBox *)));
    connect(&TheThread,SIGNAL(terminated()), this, SLOT(endThread()));
    TheThread.setdata(columnNames,parent, this);
    TheThread.start();    //run thread
}
    void myCheckItem::endThread()
    {
        m_check->setParent(m_parent);
        connect(m_check, SIGNAL(stateChanged(int)), this, SLOT(onCheckBox(int)));
    }

void myCheckItem::retThread(QCheckBox *check)
{
    m_check = check;
}

也许我错过了一些东西,或者很难重新连接线程?

由于

2 个答案:

答案 0 :(得分:2)

不得在其他线程中创建,编辑或使用UI元素。 UI元素必须在主线程(UI线程)中使用。如果在“绘制”复选框之前有耗时的先决条件,请在线程中进行工作(最终QtConcurrent)并向主线程发送信号以创建相应的复选框。

答案 1 :(得分:0)

您只能在主线程中更改GUI元素。你有多少个复选框?也许你应该创建一个有限数量的复选框,并在需要时重复使用它们?