【问题标题】:QComboBox with checkboxes带复选框的 QComboBox
【发布时间】:2014-05-13 20:33:47
【问题描述】:

我正在创建带有复选框的 QComboBox。如何防止鼠标单击时视图折叠?我希望能够设置复选框,但是每次单击项目时- QComboBox 的下拉菜单都会折叠。

注意:目前我正在调试 Qt 源代码并寻找解决方法...

【问题讨论】:

  • 你也可以使用Qxt。它有带复选框的组合框。
  • Qxt 是第三方解决方案。我不希望这些简单的事情的所有开销。
  • 对不起,萨佐诺夫。我发错地方了。

标签: qt qcombobox qstandarditemmodel qabstractitemview


【解决方案1】:

首先你需要为组合框视图安装一个事件过滤器,即:

combobox->view()->viewport()->installEventFilter(someobj);

您需要过滤组合框视图上发生的所有鼠标释放事件,以防止在您单击它时关闭它:

bool SomeObject::eventFilter(QObject *obj, QEvent *event)
{
     if (event->type() == QEvent::MouseButtonRelease) {
         int index = view()->currentIndex().row();

         if (itemData(index, Qt::CheckStateRole) == Qt::Checked) {
            setItemData(index, Qt::Unchecked, Qt::CheckStateRole);
         } else {
            setItemData(index, Qt::Checked, Qt::CheckStateRole);
         }

         [..]

         return true;
     } else {
         // Propagate to the parent class.
         return QObject::eventFilter(obj, event);
     }
}

【讨论】:

  • 谢谢,我已经实现了。这是 100% 正确的。我没有找到其他解决方案。
  • 事件过滤器必须在自定义视图设置之后安装(使用QComboBox::setView)。
  • @DmitrySazonov:我认为这很明显,因为QComboBox::view() 在设置新视图之前和之后返回不同的视图。
  • 我测试了它(Qt4)。首先 - 我创建了 new QListView,然后我安装了事件过滤器,然后 - 将其设置为 QComboBox。所以最后安装的过滤器是来自 QComboBox 的过滤器,它抑制了事件处理。
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多