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 に答える