2014-12-31 73 views
0

自2008年從諾Dielmann PyQt的郵件列表上的以下問題一直沒有得到答覆:如何在QStyledItemDelegate中繪製樣式化的焦點矩形?

[..] 我有一個QStyledItemDelegate子類實現paint()來得出一些QTableView中單元格的內容。如果其中一個單元格獲得了焦點,如何使它繪製焦點矩形?我試過這個:

class MyDelegate(QStyledItemDelegate): 
    ... 
    def paint(self, painter, option, index): 
     ... 
     painter.save() 
     if option.state & QStyle.State_HasFocus: 
      self.parent().style().drawPrimitive(QStyle.PE_FrameFocusRect, option, painter) 
     ... 
     painter.restore() 

但是這根本就沒有做什麼。沒有錯誤,沒有焦點框架。我只想讓QStyle系統以某種方式繪製通常的對焦框,如果我的自定義繪製的單元格中有一個具有焦點。 QStyle文檔告訴我創建一個QStyleOptionFocusRect並使用initFrom()。但initFrom()需要一個QWidget,在這種情況下我沒有。

我只是不明白。

什麼是平常的方式來獲得焦點幀通過自定義代表塗QTableView中的細胞?[..]

回答

0

我遇到了同樣的問題。經過很多挫折之後,我發現答案被埋在了棄用的QStyledItem類中。下面是基於該代碼的PyQt/PySide解決方案:

class MyDelegate(QtGui.QStyledItemDelegate): 
    ... 
    def drawFocus(self, painter, option, rect, widget=None): 
     if (option.state & QtGui.QStyle.State_HasFocus) == 0 or not rect.isValid(): 
      return 
     o = QtGui.QStyleOptionFocusRect() 
     # no operator= in python, so we have to do this manually 
     o.state = option.state 
     o.direction = option.direction 
     o.rect = option.rect 
     o.fontMetrics = option.fontMetrics 
     o.palette = option.palette 

     o.state |= QtGui.QStyle.State_KeyboardFocusChange 
     o.state |= QtGui.QStyle.State_Item 
     cg = QtGui.QPalette.Normal if (option.state & QtGui.QStyle.State_Enabled) else QtGui.QPalette.Disabled 
     o.backgroundColor = option.palette.color(cg, QtGui.QPalette.Highlight if (option.state & QtGui.QStyle.State_Selected) else QtGui.QPalette.Window) 
     style = widget.style() if widget else QtGui.QApplication.style() 
     style.drawPrimitive(QtGui.QStyle.PE_FrameFocusRect, o, painter, widget) 

    def paint(self, painter, option, index): 
     painter.save() 
     # ... draw your delegate here, or call your widget's render method ... 
     painter.restore() 

     painter.save() 
     # omit the last argument if you're not drawing a widget 
     self.drawFocus(painter, option, option.rect, widget) 
     painter.restore()