0

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

我有一个 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;
}

也许我遗漏了一些东西,或者重新连接线程很简单?

谢谢

4

2 回答 2

2

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

于 2013-07-04T09:00:16.720 回答
0

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

于 2013-07-04T09:00:09.080 回答