QCompleter for large models

后端 未结 1 1495
不思量自难忘°
不思量自难忘° 2021-01-15 09:11

QCompleter works slightly slow on large data sets (large models): when I start to input characters in QCombobox it passes few seconds to show auto-

相关标签:
1条回答
  • 2021-01-15 09:52

    Solution appears similar to this: https://stackoverflow.com/a/33404207/630169 as QCompleter also uses QListView in its popup(). So full solution to speed-up QCombobox is:

    Tweak combo:

    void ComboboxTools::tweak(QComboBox *combo)
    {
      //  For performance reasons use this policy on large models
      // or AdjustToMinimumContentsLengthWithIcon
      combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
    
      // Improve combobox view performance
      tweak((QListView *)combo->view());
    
      // Improve combobox completer performance
      tweak(combo->completer());
    }
    

    Tweak dropdown/popup (view):

    void ComboboxTools::tweak(QListView *view)
    {
      // Improving Performance:  It is possible to give the view hints
      // about the data it is handling in order to improve its performance
      // when displaying large numbers of items. One approach that can be taken
      // for views that are intended to display items with equal sizes
      // is to set the uniformItemSizes property to true.
      view->setUniformItemSizes(true);
      // This property holds the layout mode for the items. When the mode is Batched,
      // the items are laid out in batches of batchSize items, while processing events.
      // This makes it possible to instantly view and interact with the visible items
      // while the rest are being laid out.
      view->setLayoutMode(QListView::Batched);
      // batchSize : int
      // This property holds the number of items laid out in each batch
      // if layoutMode is set to Batched. The default value is 100.
      // view->setBatchSize(100);
    }
    

    Tweak completer:

    void ComboboxTools::tweak(QCompleter *completer)
    {
      completer->setCaseSensitivity(Qt::CaseInsensitive);
      // If the model's data for the completionColumn() and completionRole() is sorted
      // in ascending order, you can set ModelSorting property
      // to CaseSensitivelySortedModel or CaseInsensitivelySortedModel.
      // On large models, this can lead to significant performance improvements
      // because the completer object can then use a binary search algorithm
      // instead of linear search algorithm.
      completer->setModelSorting(QCompleter::CaseSensitivelySortedModel);
    
      // Improve completer popup (view) performance
      tweak((QListView *)completer->popup());
    }
    
    0 讨论(0)
提交回复
热议问题