2013-07-04 4 views
0

Я пробовал это некоторое время, и кажется, что это не что-то общее, поскольку я не нашел много информации.QThread, создающий элемент виджета GUI в потоке

У меня есть QTree, в который я положил элемент, на моем элементе у меня есть флажок в первом столбце.

Проблема: флажок не оптимизирован для того, чтобы его обрабатывали так, и занимает довольно много времени, как только имеется несколько элементов.

Так что я использую поток для создания флажка перед тем, как вставлять в свой список, но кажется невозможным вернуть флажок в поток графического интерфейса.

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; 
} 

Может быть, я что-то отсутствует, или это просто не представляется возможным прикрепить нить?

Thanks

+0

Почему вам действительно нужно создать виджет в потоке? не проще ли создавать данные, которые вам нужны в потоке, и сигнализировать gui, что исходные данные готовы и могут быть использованы для создания нового ui, который необходим? – Zlatomir

+0

Это не обработка данных, требующая времени, но создание флажка: m_check = new QCheckBox(); – Damien

+0

Что вы делаете, если создали этот флажок? вы добавляете его в treewidget ?? – UmNyobe

ответ

2

не должен создавать, редактировать или работать с элементами пользовательского интерфейса в других тонах. Элементы пользовательского интерфейса должны обрабатываться в основном потоке (поток пользовательского интерфейса). Если у вас есть трудоемкие предварительные условия перед «рисованием» флажка, выполните свою работу в потоке (в конечном итоге QtConcurrent) и отправьте сигнал в основной поток для создания соответствующего флажка.

+0

К сожалению, это создание самого флажка, который занимает много времени. m_check = new QCheckBox(); В основном создание элемента в работе потока, но затем поток не остановится. – Damien

+1

Объект находится в потоке создания, поэтому m_check все равно будет в клиентском потоке. Вы определенно не должны этого делать. Вы можете перемещать объект с помощью moveToThread(), но это не предназначено для элементов GUI. Если у вас есть большое количество флажков, то действительно думайте о том, чтобы держать их статичными в пуле и повторно использовать их. Поскольку вы используете их в древовидном элементе, попробуйте переопределить QAbstractItemDelegate, чтобы сам список мог обрабатывать создание. Это может вызвать у вас небольшой толчок, но не ожидайте от него большой части. –

+0

Я понимаю вашу точку зрения, кажется, что у меня нет потокового решения, хотя у меня есть некоторые воспоминания о том, что поток можно перенастроить, может быть, на linux ?. Создание пула флажка потребует большой модификации кода. – Damien

0

Вы можете изменить элементы графического интерфейса только в основной теме. Сколько флажков у вас есть? Может быть, вам нужно создать ограниченное количество флажков и повторное использование их при необходимости?

+0

Мой флажок находится в списке, может быть более 200. Они обновляются в списке. – Damien

+0

Сколько времени занимает создание 200 QCheckBoxes? В любом случае, вы можете использовать QTreeView вместо QTreeWidget, он может создавать флажки самостоятельно, позволяя вам не думать о производительности. – SpongeBobFan

Смежные вопросы