0

Delegateから継承するカスタムクラスがありQStyledItemDelegateます。そのpaint()場合、チェック可能にする必要があるものを追加したいと思いQStyleOptionButtonます。出来ますか?

たとえば、目のアイコンで可視性プロパティを示します。ボタンを押すと、目のアイコンが閉じた目のアイコンに変わります。

メソッド内でpaint()、これはボタンを作成するための現在のコードです。

QStyleOptionButton buttonVis;
buttonVis.rect = getButtonVisibilityRect();
buttonVis.iconSize = QSize(sizeX, sizeY);
buttonVis.icon = icon;
buttonVis.state = QStyle::State_Enabled;
buttonVis.features = QStyleOptionButton::None;

QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonVis, painter);

にロードするアイコンは、次の方法buttonVisで作成されます。

QIcon icon;
icon.addPixmap(QPixmap(":/control-visibility.svg"), QIcon::Normal, QIcon::On);
icon.addPixmap(QPixmap(":/control-visibilityNo.svg"), QIcon::Normal, QIcon::Off);

プログラムを実行すると、ボタンには目を閉じたアイコンが表示されます。どのアイコンを表示するかを制御するコマンドはありますか? 初期のレイアウトを実装できない場合、どの方向に進むべきでしょうか?

編集:チェックボックスの外観をシミュレートするために使用するアイコンを選択する方法を見つけました。代わりに if 行buttonVis.state = QStyle::State_Enabled;があるべきです:

if (/* current item checkbox checked? */)
    buttonVis.state = QStyle::State_Enabled | QStyle::State_On;
else
    buttonVis.state = QStyle::State_Enabled | QStyle::State_Off;

ここでの問題は、その状態が何であるか、または から設定する方法を理解することeditorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)です。option問題は、常に参照しているため、自分で実際に変更できないことです。それを行う方法、またはそれを回避する方法はありますか?

4

2 に答える 2

0

最後に、特定のフラグを設定してテストし、ボタンがアイコンを変更するかどうかを確認する方法を見つけました。

したがって、アイコンの変更については、質問の編集で述べたように、次のようなものを使用する必要があります。

buttonVis.state |= QStyle::State_Enabled;
buttonVis.state |= isChanged? QStyle::State_Off : QStyle::State_On;

isChangedそのため、フラグを設定する方法について説明します。editorEvent()また、デリゲートのメソッド内で実行できます。

bool Delegate::editorEvent(QEvent *event, QAbstractItemModel *model, const StyleOptionViewItem &option, const QModelIndex &index)
{
    if (/* event is release and it is over the button area*/)
    {
        bool value = index.data(Qt::UserRole).toBool();
        // this is how we setup the condition flag
        model->setData(index, !value, Qt::UserRole);
        return true;
    }
}

setup フラグを使用するには、setup のpaint()直前にイベントで行いbuttonVis.stateます。

bool isChanged = index.data(Qt::UserRole).toBool();

これらの手順を追加することQStyleOptionButtonで、チェックボックスのように動作するようになりましたが、アイコンが状態として変化します。

于 2016-04-22T16:23:16.877 に答える