Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中绘制复选标记_Qt_User Interface_Qtreeview_Qtgui - Fatal编程技术网

在Qt中绘制复选标记

在Qt中绘制复选标记,qt,user-interface,qtreeview,qtgui,Qt,User Interface,Qtreeview,Qtgui,我正在使用simple QTreeView。树的每一行都是从一个类EditorRow继承的特定类 EditorRow具有以下功能: virtual QVariant data(ColumnIndexEnum index, int role = Qt::DisplayRole) const = 0; virtual void setData(const QVariant& data, ColumnIndexEnum index, int role = Qt::UserRole); virt

我正在使用simple QTreeView。树的每一行都是从一个类EditorRow继承的特定类

EditorRow具有以下功能:

virtual QVariant data(ColumnIndexEnum index, int role = Qt::DisplayRole) const = 0;
virtual void setData(const QVariant& data, ColumnIndexEnum index, int role = Qt::UserRole);
virtual QWidget* getEditor(QWidget* parent) const;
每一行都有其特定的小部件,在选择该行时显示在右列中。当未选择该行时,数据函数将为每个行返回适当的值。在QComboBox中选择的值

但对于row,它的小部件是QCheckBox,我需要在未选中该行时绘制一个checkedor unchecked复选框

我尝试过这样的装饰角色:

if(Qt::DecorationRole == role)
  {
    if(ValueColumn == index)
    {
      QStyle* style = QApplication::style();
      QStyleOptionButton opt;
      opt.state |= QStyle::State_Enabled;

      if(isChecked())
         opt.state = QStyle::State_On;
      else
         opt.state = QStyle::State_Off;


      const int indicatorWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &opt);
      const int indicatorHeight = style->pixelMetric(QStyle::PM_IndicatorHeight, &opt);
      const int listViewIconSize = indicatorWidth;
      const int pixmapWidth = indicatorWidth;
      const int pixmapHeight = qMax(indicatorHeight, listViewIconSize);

      opt.rect = QRect(0, 0, indicatorWidth, indicatorHeight);

      QPixmap pixmap = QPixmap(pixmapWidth, pixmapHeight);
      pixmap.fill(Qt::transparent);
      {
      QPainter painter(&pixmap);
      QCheckBox cb;
      cb.setLayoutDirection(Qt::RightToLeft);
      style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &painter, &cb);
      }
      return QIcon(pixmap);
    }
}
它实际上可以工作,但图标始终显示,即使选中了行也是如此。 我认为这是因为装饰的作用

你知道如何处理这个问题吗


谢谢。

为什么不为可检查的项目使用Qt::ItemIsUserCheckable标志?它会自动画出复选框。你能提供一个简单的例子说明这个用法吗。我找不到使用该标志的示例。在您的模型重新实现中,QAbstractItemModel::flagsconst QModelIndex&const函数应返回Qt::ItemIsEdit | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;对于可检查的节点。不要忘记设置默认值:model->data Qt::Unchecked,Qt::CheckStateRole;另外,如果您预先提供自定义图纸,您可以检查此答案-