2

私は独自の 4 状態ボタンを作成していますが、checkStateSet() メソッドに何を入れればよいかわかりません。

これが私がこれまでに得たものです:

    SyncDirectionButton::SyncDirectionButton(QWidget *parent) :
 QAbstractButton(parent)
    {
 setCheckable(true);
 setToolTip(tr("Click to change the sync direction"));
 _state = NoSync;
    }

    void SyncDirectionButton::paintEvent(QPaintEvent *e)
    {
 static QPixmapCache::Key noneKey;
 static QPixmapCache::Key bothKey;
 static QPixmapCache::Key leftKey;
 static QPixmapCache::Key rightKey;

 QPainter p(this);

 QPixmap pix;
 if (checkState() == SyncLeft) {
  if (!QPixmapCache::find(leftKey, &pix)) {
   pix.load(":/icons/sync-left.png");
   leftKey = QPixmapCache::insert(pix);
  }
 } else if (checkState() == SyncBoth) {
  if (!QPixmapCache::find(rightKey, &pix)) {
   pix.load(":/icons/sync-right.png");
   rightKey = QPixmapCache::insert(pix);
  }
 } else if (checkState() == SyncRight) {
  if (!QPixmapCache::find(bothKey, &pix)) {
   pix.load(":/icons/sync-both.png");
   bothKey = QPixmapCache::insert(pix);
  }
 } else if (checkState() == NoSync) {
  if (!QPixmapCache::find(noneKey, &pix)) {
   pix.load(":/icons/application-exit.png");
   noneKey = QPixmapCache::insert(pix);
  }
 }
 p.drawPixmap(0,0,pix);
    }

    SyncDirectionButton::DirectionState SyncDirectionButton::checkState() const
    {
 return _state;
    }

    void SyncDirectionButton::setCheckState(DirectionState state)
    {
 setChecked(state != NoSync);
 if (state != _state) {
  _state = state;
 }
    }

    QSize SyncDirectionButton::sizeHint() const
    {
 return QSize(180,90);
    }

    void SyncDirectionButton::checkStateSet()
    {

    }

    void SyncDirectionButton::nextCheckState()
    {
 setCheckState((DirectionState)((checkState()+1)%4));
    }
4

1 に答える 1

0

まず、QAbstractButton には 1 つの「未チェック」状態があり、複数の「チェック済み」状態がある場合があります。

このメソッドは、チェック状態が「未チェック」から「チェック済み」に変更されたときに呼び出されます。初期の「チェック済み」状態を設定する必要があります。これは、3 つの「チェック済み」値の最初の状態である必要があります。

また、実装 nextCheckState() は、3 番目にチェックされた値で呼び出されて「チェックされていない」状態に戻るときに、setChecked(false) を呼び出す必要があります。

QAbstractButton のコードを参照してください。

于 2010-05-30T16:19:08.390 に答える