QDialog에 10 QComboBox가 있습니다. 그리고 대화 상자를 여는 동안이 콤보 상자에 데이터를 채우고 있습니다. 대화 상자를로드하는 데 7 초가 걸리며, 콤보 상자에 클릭 된 슬롯이 없으므로이 문제를 해결하는 방법을 설명합니다. 스레드를 사용하여이 문제를 해결할 수 있다고 생각하지만 QThread에 대해 전혀 알지 못합니다.QComboBox에서 데이터를 채우기 위해 QDialog의 스레딩을 사용하는 방법은 무엇입니까?
답변
QT가 위젯을 주 스레드 외부에서 수정할 수 없기 때문에 해결책이 쉽지 않습니다.
간단한 해결책 : 스레드를 사용하여 데이터를 QStringLists에 넣고 addItems를 사용하여 설정하십시오. QThreadPool은이 용도로 사용하는 것이 더 간단합니다. 이 솔루션은 문제가 처리 자체가 아니라 데이터 자체의 크기 인 경우 도움이되지 않습니다. (학습을위한 좋은)
복합 솔루션 : 당신은 그러나 위젯 (QAbstractItemModel)의 모델을 다시 구현하고 모델에 QThread를 사용할 수 있습니다. 단지는, setVisible (부울)를 덮어 -
또한 당신은 부하 데이터는, setVisible이 true로 처음이라고 자신의 QListView derivered 클래스를 만들 수 있습니다. setView()를 사용하여이 클래스의 인스턴스를 각 콤보 상자에 설정하십시오.
QThread의 사용법은 예제를 참조하십시오. 튜토리얼 읽기 ... 복잡한 설명이 있지만 여기서 예제와 튜토리얼이 가득합니다.
나중에 편집 :이 이벤트 필터 사용하는 것도 가능하다
:
// Install event filter
MyDlg::MyDlg()
{
qApp->installEventFilter (this);
}
// search for the view of the combo to be activated
// and fill it.
bool MyDlg::eventFilter (QObject * obj, QEvent * event)
{
QSet<QAbstractItemView *> myComboViews;
my_combos.insert(combo1->view());
if (event->type() == QEvent::Show)
{
QAbstractItemView * view = qobject_cast<QAbstractItemView*>(obj);
if (myComboViews.contains(obj) && view->isVisible())
{
fillComboView(view);
}
}
return QDialog::eventFilter (obj, event);
}
코드는 안된입니다,하지만 당신은 ideea의를 얻을 수 있습니다.
고마워 Dragos, 내가 말한 것처럼 스레딩을하려고합니다. 콤보 박스 클릭과 같은 이벤트가 있습니까? 그렇다면 그에 대한 세부 정보를 제공하십시오. – pravin
나는 이것에 대한 방출 어떤 신호를 찾을 수 없습니다,하지만 당신은 당신은 이벤트 필터를 사용할 수 있습니다. 마우스 클릭이 필터링 어렵 때문에, 콤보의보기에 쇼 이벤트를 사용하는 것이 좋습니다 - 드롭 다운 버튼에 액세스 할 수 없습니다. –
[지금까지 시도한 내용] (http://whathaveyoutried.com)을 보여주기 위해 질문을 편집하십시오. 문제가있는 코드의 [mcve]를 포함시켜야 특정 문제를 해결할 수 있습니다. 또한 [ask]를 읽어야합니다. –