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



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

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

问题:复选框没有优化为按原样处理,一旦有几个元素,就需要相当长的时间。

因此,在放入列表之前,我使用一个线程来创建复选框,但似乎不可能在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;
}

也许我遗漏了什么,或者根本不可能重新连接螺纹?

感谢

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

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

最新更新