2

次のようにカスタマイズする必要があります:QCheckboxチェックボックスとテキストの間に四角形を追加します例:

これを行うには、継承QCheckBoxしてオーバーライドしますpaintEvent(QPaintEvent*)

void customCheckBox::paintEvent(QPaintEvent*){
      QPainter p(this);
      QStyleOptionButton opt;
      initStyleOption(&opt);
      style()->drawControl(QStyle::CE_CheckBox,&opt,&p,this);

      QFontMetrics font= this->fontMetrics();// try to get pos by bounding rect of text, but it ain't work :p
      QRectF rec = font.boundingRect(this->text());
      p.fillRect(rect,QBrush(QColor(125,125,125,128)));
      p.drawRect(rect);

}

を配置する位置がわからないという問題がありQRectF recます。また、サイズを小さく設定することはできません。たとえば、rec< QSize(10,10) のサイズになると消えます。

どんなアイデアでも大歓迎です。

PS: Qt 4.8.5 で OpenSUSE 13.1 を使用しています。

4

2 に答える 2

3

主なアイデアは、チェックボックス描画のデフォルトの実装をコピーし、必要に応じて変更することです。デフォルトの実装ではラベルの四角形を取得するため、この場所に新しい要素を描画し、ラベルを右にシフトするだけです。また、新しい要素とデフォルト コンテンツの両方が最小サイズに収まるように、サイズ ヒントを調整する必要があります。

class CustomCheckBox : public QCheckBox {
  Q_OBJECT
public:
  CustomCheckBox(QWidget* parent = 0) : QCheckBox(parent) {
    m_decoratorSize = QSize(16, 16);
    m_decoratorMargin = 2;
  }

  QSize minimumSizeHint() const {
    QSize result = QCheckBox::minimumSizeHint();
    result.setWidth(result.width() + m_decoratorSize.width() + m_decoratorMargin * 2);
    return result;
  }

protected:
  void paintEvent(QPaintEvent*) {
    QPainter p(this);
    QStyleOptionButton opt;
    initStyleOption(&opt);
    QStyleOptionButton subopt = opt;
    subopt.rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &opt, this);
    style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &subopt, &p, this);
    subopt.rect = style()->subElementRect(QStyle::SE_CheckBoxContents, &opt, this);
    p.fillRect(QRect(subopt.rect.topLeft() + QPoint(m_decoratorMargin, 0),
                     m_decoratorSize), QBrush(Qt::green));
    subopt.rect.translate(m_decoratorSize.width() + m_decoratorMargin * 2, 0);
    style()->drawControl(QStyle::CE_CheckBoxLabel, &subopt, &p, this);
    if (opt.state & QStyle::State_HasFocus) {
      QStyleOptionFocusRect fropt;
      fropt.rect = style()->subElementRect(QStyle::SE_CheckBoxFocusRect, &opt, this);
      fropt.rect.setRight(fropt.rect.right() + 
                          m_decoratorSize.width() + m_decoratorMargin * 2);
      style()->drawPrimitive(QStyle::PE_FrameFocusRect, &fropt, &p, this);
    }
  }

private:
  QSize m_decoratorSize;
  int m_decoratorMargin;
};

チェックボックスはプラットフォームごとに大幅に異なるため、このソリューションは移植性がない可能性があることに注意してください。Windowsでのみテストしました。が提供するデフォルトの実装を使用しましたQCommonStyle

于 2015-05-30T19:49:29.493 に答える
1

QAbstractButtoniconには、インスタンス化されたサブクラスに応じて異なる方法で描画される というプロパティがあります。

幸いなことに、アイコンの位置はQCheckBox、写真で示した位置とまったく同じです。

したがって、カスタマイズのために行う必要がQCheckBoxあるのは、アイコンがどうあるべきかを定義することだけpaintEventで、残りはデフォルトで処理されます。

簡単にするために、アイコンのサイズはチェックボックス自体と同じサイズにする必要があると想定しています。

class CheckBox : public QCheckBox {
public:
    CheckBox() {
        QStyleOptionButton option;
        initStyleOption(&option);
        QSize indicatorSize = style()->proxy()->subElementRect(QStyle::SE_CheckBoxIndicator, &option, this).size();

        QPixmap pixmap(indicatorSize);
        pixmap.fill(Qt::green);

        QIcon icon;
        icon.addPixmap(pixmap);

        setIcon(icon);

    }
};

Qt 5.2.1 を搭載した Windows 8.1 マシンでこれをテストしましたが、動作します。

于 2015-05-30T21:01:16.083 に答える