2017-02-23 7 views
-1

QDialog에 10 QComboBox가 있습니다. 그리고 대화 상자를 여는 동안이 콤보 상자에 데이터를 채우고 있습니다. 대화 상자를로드하는 데 7 초가 걸리며, 콤보 상자에 클릭 된 슬롯이 없으므로이 문제를 해결하는 방법을 설명합니다. 스레드를 사용하여이 문제를 해결할 수 있다고 생각하지만 QThread에 대해 전혀 알지 못합니다.QComboBox에서 데이터를 채우기 위해 QDialog의 스레딩을 사용하는 방법은 무엇입니까?

+0

[지금까지 시도한 내용] (http://whathaveyoutried.com)을 보여주기 위해 질문을 편집하십시오. 문제가있는 코드의 [mcve]를 포함시켜야 특정 문제를 해결할 수 있습니다. 또한 [ask]를 읽어야합니다. –

답변

0

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의를 얻을 수 있습니다.

+0

고마워 Dragos, 내가 말한 것처럼 스레딩을하려고합니다. 콤보 박스 클릭과 같은 이벤트가 있습니까? 그렇다면 그에 대한 세부 정보를 제공하십시오. – pravin

+0

나는 이것에 대한 방출 어떤 신호를 찾을 수 없습니다,하지만 당신은 당신은 이벤트 필터를 사용할 수 있습니다. 마우스 클릭이 필터링 어렵 때문에, 콤보의보기에 쇼 이벤트를 사용하는 것이 좋습니다 - 드롭 다운 버튼에 액세스 할 수 없습니다. –