3

チェック可能なプロパティを有効にして、QGroupBox クラスをサブクラス化しました。トグル/チェック済みイベントの動作をオーバーライドしようとしています。

コードは次のとおりです。

class SideWidgetGroupBox: public QGroupBox
{
    Q_OBJECT
public:
    SideWidgetGroupBox(QWidget* parent = 0): QGroupBox(parent)
    {
        this->setCheckable(true);
        connect(this, SIGNAL(toggled(bool)), this, SLOT(my_toggled(bool)));
    }

private slots:
    void my_toggled (bool on)
    {
        std::cout << "my toggled method" <<std::endl;
    }
};

これまでのところ、私のスロットは実行されます。ただし、グループボックスのコンテンツも有効/無効になります。それを防ぐ方法はありますか?または、元の有効/無効状態を手動でリセットする必要がありますか?

4

1 に答える 1

6

コンテンツの有効化/無効化を防ぐ方法はありますか?

はい、しかし、そこにはないので、この方法は簡単ではありませんQCheckBox。チェックボックスのように見える部分は の領域ですQGroupBox。そして、すべてのイベントは以下によって処理されQGroupBoxます:
1. メソッドをオーバーライドし、基本クラスによるイベント の処理をevent防ぎます。QEvent::KeyReleaseQEvent::MouseRelease

bool SideWidgetGroupBox::event(QEvent *e)
{
  switch (e->type()) {
   case QEvent::KeyRelease:
   case QEvent::MouseButtonRelease:
     myHandler(e);
     return true;
  }
 return QGroupBox::event(e);
}

2.チェックボックスが押されたか、マウスがクリックされたmyHandlerかを確認します。spacecheckBox の値を保存し、必要なことを行います。このコードを使用して、カーソルの下にあるものを確認します。

QStyleOptionGroupBox box;
initStyleOption(&box);
QStyle::SubControl released = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box,
                                                             event->pos(), this);
bool toggle = released == QStyle::SC_GroupBoxLabel || released == QStyle::SC_GroupBoxCheckBox;
if (toggle)
{
    m_state = !m_state;
    update();
}

3. メソッドinitStyleOptionを追加し、checkBox の状態に設定stateします (自分で保存する必要があります)。

void SideWidgetGroupBox::initStyleOption(QStyleOptionGroupBox *option) const
{
    QGroupBox::initStyleOption(option);
    QStyle::State flagToSet = m_state ? QStyle::State_On : QStyle::State_Off;
    QStyle::State flagToRemove = m_state ? QStyle::State_Off : QStyle::State_On;

    option->state |= flagToSet;     
    option->state &= ~flagToRemove;
    option->state &= ~QStyle::State_Sunken;
}

4.メソッドinitStyleOptionインQGroupBoxは仮想ではないため、再実装する必要がありますpaintEvent:

void paintEvent(QPaintEvent *)
{
    QStylePainter paint(this);
    QStyleOptionGroupBox option;
    initStyleOption(&option);
    paint.drawComplexControl(QStyle::CC_GroupBox, option);
}

元の有効/無効状態を手動でリセットする必要がありますか? 現在のチェック状態をチェックし、子の有効化を防止するため、
これを行うことはできません。を使用して直接子供をsetEnabled呼び出すことができますが、setEnabledthis->findChildren<QWidget*>

提案
上記の方法を使用するか、標準の checkBox および (または) ラベルを削除して、独自QCheckBoxのグループを (もちろんレイアウトなしで) 配置して、必要に応じて使用できます。グループを移動できる場合は、チェック ボックスも移動する必要があります。

于 2014-08-29T07:47:12.690 に答える