2014-03-30 62 views
1

我正在嘗試將圓角添加到QDialog。我正在定義自己的paintEvent方法來創建圓角。它正在工作,但它爲所有事物添加了圓潤的邊框。即使光標正在獲得邊框。有什麼辦法可以禁用這種行爲嗎?如何停止繪製子部件的paintEvent?

示例代碼:

from PySide import QtCore, QtGui 


class RenameDialog(QtGui.QDialog): 
    def __init__(self, parent=None, **kwargs): 
     super(RenameDialog, self).__init__(
      parent=parent, f=QtCore.Qt.CustomizeWindowHint) 
     self.fieldA = QtGui.QLineEdit(self) 
     self.fieldB = QtGui.QLineEdit(self) 

     self.setLayout(QtGui.QHBoxLayout()) 
     self.layout().addWidget(self.fieldA) 
     self.layout().addWidget(self.fieldB) 

     # Set background transparent. Only items drawn in paintEvent 
     # will be visible. 
     palette = QtGui.QPalette() 
     palette.setColor(QtGui.QPalette.Base, QtCore.Qt.transparent) 
     self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True) 
     self.setPalette(palette) 

    def paintEvent(self, event): 
     painter = QtGui.QPainter(self) 
     fillColor = QtGui.QColor(75, 75, 75, 255) 
     lineColor = QtCore.Qt.gray 

     painter.setRenderHint(QtGui.QPainter.Antialiasing) 
     painter.setPen(QtGui.QPen(QtGui.QBrush(lineColor), 2.0)) 
     painter.setBrush(QtGui.QBrush(fillColor)) 
     painter.drawRoundedRect(event.rect(), 15, 15) 

我試圖用paintEvent,因爲要做到這一點:

  • QDialog的樣式表不能使用border-radius。彎曲的邊框顯示出來,但角落仍然可見。
  • QDialogs.setMask()的作品,但沒有辦法(我知道的)反對別名的面具。

這裏是什麼樣子:

borders everywhere

+0

有截圖嗎? 「爲所有事物添加圓角邊框」聽起來很奇怪。 –

+0

這很奇怪。我添加了一個截圖。在我關注該字段之前,第二個字段上的邊框不會出現。 – Jordan

回答

3

繪製事件被髮送到一個窗口/小部件,而精確的矩形需要更新而不是小部件的整個邊界矩形。當你調用event.rect()返回需要更新的矩形(據我所知)

嘗試改變這一行 painter.drawRoundedRect(event.rect(), 15, 15) 對此 painter.drawRoundedRect(self.rect(), 15, 15)

編輯: 您還需要任意位置添加此行在構造函數中 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

enter image description here

希望這有助於。

+0

啊!這很有道理。謝謝!呵呵,我在示例中設置了CustomizeWindowHint - 這與我的系統(KDE)上的FramelessWindowHint做的事情是一樣的。也許它在其他窗口管理器上表現略有不同。 – Jordan

0

我找到了一個變通的現在。您可以在子項上使用QPainter.eraseRect來隱藏額外邊框,並設置正確的樣式表。我也發現在QPainter.fillRect這個作品上繪畫也非常有效。

def paintEvent(self, event): 
    painter = QtGui.QPainter(self) 
    fillColor = QtGui.QColor(75, 75, 75, 255) 
    lineColor = QtCore.Qt.gray 

    painter.setRenderHint(QtGui.QPainter.Antialiasing) 
    painter.setPen(QtGui.QPen(QtGui.QBrush(lineColor), 2.0)) 
    painter.setBrush(QtGui.QBrush(fillColor)) 
    painter.drawRoundedRect(event.rect(), 15, 15) 

    # Sketchy fix: 
    painter.eraseRect(self.childrenRect()) 
    # OR 
    painter.fillRect(self.childrenRect(), QtGui.QBrush(fillColor)) 

雖然這並不回答我的原始問題。我想避免這種行爲,而不是掩蓋它。所以我不打算把這個標記爲答案。

相關問題