如何在QDialog中使用线程来填充QComboBox中的数据?

时间:2017-02-23 12:38:24

标签: c++ qt qt-creator

我在QDialog中有10个QComboBox。我在打开Dialog的同时将数据填充到这些组合框中,加载Dialog需要7秒钟,如何解决这个问题,因为组合框中没有点击的插槽。我想我们可以通过使用Thread解决这个问题,但我不知道QThread。

1 个答案:

答案 0 :(得分:0)

解决方案并不容易,因为QT不允许在主线程之外修改小部件。

简单解决方案: 使用线程将数据放入QStringLists并使用addItems设置它。 QThreadPool更易于用于此用例。 如果问题是数据本身的大小而不是处理,则此解决方案将无济于事。

复杂的解决方案(非常适合学习): 但是,您可以重新实现窗口小部件的模型(QAbstractItemModel),并在模型中使用QThread。

此外,您可以创建自己的QListView派生类,当第一次使用true调用setVisible时加载数据 - 只需覆盖setVisible(bool)。 使用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。