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