2014-03-30 4 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)

EDIT: Вы также должны добавить эту строку в любом месте в конструкторе self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

enter image description here

Надеюсь, это поможет.

+0

Ах! Это имеет смысл. Благодаря! О, и я устанавливаю CustomizeWindowHint в примере - это делает то же самое, что и FramelessWindowHint в моей системе (KDE). Может быть, он ведет себя немного иначе, чем у других оконных менеджеров. – 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)) 

Это не отвечает на мой первоначальный вопрос. Я бы хотел избежать этого поведения, а не маскировать его. Поэтому я не собираюсь отмечать это как ответ.

Смежные вопросы