在Qt中画一个复选标记

时间:2014-02-18 06:01:55

标签: qt user-interface qtreeview qtgui

我正在使用简单的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;

每一行都有其特定的小部件,在选择该行时会显示在右侧列中。未选择行时data函数会为每行返回适当的值(例如,在QComboBox中选择的值)。

但是对于行,其小部件是QCheckBox,我需要在未选中行时绘制一个选中(或未选中)复选框。

我试图像这样使用装饰角色:

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);
    }
}

它确实有效,但即使选择了行,也会始终显示图标。 我认为这是因为DecorationRole。

您对如何处理此问题有任何想法吗?

谢谢。

0 个答案:

没有答案