2016-03-11 60 views
0

我有一個自定義Delegate類繼承自QStyledItemDelegate。在其paint()事件中,我想添加QStyleOptionButton這應該是可檢查的。可能嗎?如何設置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); 

對於那一刻,我運行我的程序,該按鈕有一個閉着眼睛的圖標。是否有命令來控制顯示哪個圖標?如果我的初始佈局不可能實現,那麼正確的方向是什麼?

編輯:我發現如何選擇使用哪個圖標來模擬複選框外觀。相反,如果線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,因爲它是不變的參考。任何想法如何做到這一點,或如何解決它?

回答

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; 
    } 
} 

現在使用設置標誌,我們這樣做是在paint()事件正確之前,我們建立了buttonVis.state

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

通過增加這些步驟我的QStyleOptionButton現在表現得像複選框,但它將圖標更改爲狀態。

0

你可以嘗試這樣的事情:

QStyleOptionButton option; 
option.initFrom(this); 
... 
QStylePainter p(this); 
if (option.state.testFlag(QStyle::State_Sunken)) { 
    p.drawPixmap(this->rect(), QPixmap(":/control-visibility")); 
} else { 
    p.drawPixmap(this->rect(), QPixmap(":/control-visibilityNo")); 
} 

小心SVG文件,與巴第一次嘗試。

QStyle :: State_Sunken 0x00000004用於指示凹陷或按下的小部件是否爲 。

+0

感謝您的回覆。我發現如何切換圖標:'buttonVis.state = QStyle :: State_Enabled | QStyle :: State_Off;'或'buttonVis.state = QStyle :: State_Enabled |將QStyle :: STATE_ON;'。我試過你提出的條件'option.state。testFlag(QStyle :: State_Sunken)',但似乎沒有辦法。當我點擊我的按鈕時,似乎沒有設置此標誌,我不知道如何強制它自動切換狀態。在代理的'editorEvent'中,我可以檢查何時按下按鈕,但是,我不能更改'option',因爲它是作爲'const&'傳遞的。 – vicrucann

相關問題