コンテンツの有効化/無効化を防ぐ方法はありますか?
はい、しかし、そこにはないので、この方法は簡単ではありませんQCheckBox
。チェックボックスのように見える部分は の領域ですQGroupBox
。そして、すべてのイベントは以下によって処理されQGroupBox
ます:
1. メソッドをオーバーライドし、基本クラスによるイベント の処理をevent
防ぎます。QEvent::KeyRelease
QEvent::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
かを確認します。space
checkBox の値を保存し、必要なことを行います。このコードを使用して、カーソルの下にあるものを確認します。
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
呼び出すことができますが、setEnabled
this->findChildren<QWidget*>
提案
上記の方法を使用するか、標準の checkBox および (または) ラベルを削除して、独自QCheckBox
のグループを (もちろんレイアウトなしで) 配置して、必要に応じて使用できます。グループを移動できる場合は、チェック ボックスも移動する必要があります。