QFrame не принимает QWidget в качестве родителя? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь сделать так, чтобы Make CancelCross был дочерним элементом класса Notifier, но когда я это делаю, крестик CancelCross не виден. Но если я не родитель, то это хорошо видно. Я попытался использовать его в QMainWindow, но не повезло. Что-то не так в моем коде?

class CloseCrosss(QtGui.QFrame):
    def __init__(self, QWidgetparent = None):
        QtGui.QFrame.__init__(self, parent=QWidgetparent)


    def paintEvent(self, e):
        qp = QtGui.QPainter()
        pen = QtGui.QPen(Qt.red)
        qp.begin(self)
        qp.setPen(pen)
        qp.drawLine(460, 10, 470, 20)
        qp.drawLine(470, 10, 460, 20)
        qp.end()


class Notifier(QtGui.QWidget):
    def __init__(self, message=None):
        QtGui.QWidget.__init__(self)
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
        _desktop = QtGui.QApplication.desktop()
        size = _desktop.screenGeometry()

        self.resize(size.width() * 25 / 100, size.height() * 3 / 100)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.main_layout = QtGui.QVBoxLayout()
        self.move(size.width() - (size.width() * 25 / 100) - 10, 50)

        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.main_layout.setSpacing(0)

        self.label = QtGui.QLabel(message)
        self.label.setStyleSheet("color: lightgreen; font: 14px;")
        self.label.setIndent(20)
        self.main_layout.addWidget(self.label)
        self.setLayout(self.main_layout)


    def paintEvent(self, event):
        s = self.size()
        qp = QtGui.QPainter()
        qp.begin(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing, True)
        qp.setPen(QtGui.QColor(255, 255, 255, 200))
        qp.setBrush(QtGui.QColor(0, 0, 0, 200))
        qp.drawRoundedRect(0, 0, s.width(), s.height(), 5, 5)
        qp.end()


    def closeEvent(self):
        self.kill()


if __name__ == "__main__":
    QApp = QtGui.QApplication(sys.argv)
    window = Notifier()
    cross = CloseCrosss(QWidgetparent=window)
    window.show()
    cross.show()
    QApp.exec_()

1 Ответ

0 голосов
/ 03 сентября 2018

Положение дочерних элементов относительно их родителя, если у виджета нет отца, тогда его положение относительно экрана. И эта система координат используется для рисования, например, в вашем случае qp.drawLine(460, 10, 470, 20) означает, что вы собираетесь рисовать линию, которая идет от (460, 10) до (470, 20) к уведомителю. Высота уведомителя составляет 3% экрана, а для моих 3% экрана это намного меньше, чем 470 , поэтому картина отбрасывается.

В вашем случае я понимаю, что вы хотите нарисовать крест 10х10, затем просто нарисуйте этот крест и переместите его в верхний левый угол.

import sys
from PyQt4 import QtCore, QtGui


class CloseCrosss(QtGui.QFrame):
    clicked = QtCore.pyqtSignal()

    def __init__(self, side=10, parent=None):
        QtGui.QFrame.__init__(self, parent)
        self._side = side
        self.setFixedSize(side, side)
        if parent:
            parent.installEventFilter(self)

    def mouseReleaseEvent(self, event):
        self.clicked.emit()
        QtGui.QFrame.mouseReleaseEvent(self, event)

    def paintEvent(self, e):
        qp = QtGui.QPainter(self)
        qp.setPen(QtCore.Qt.red)
        qp.drawLine(0, 0, self._side, self._side)
        qp.drawLine(self._side, 0, 0, self._side)

    def eventFilter(self, watched, event):
        if watched == self.parentWidget() and self.parentWidget():
            if event.type() == QtCore.QEvent.Resize:
                self.adjustSize()
        return QtGui.QFrame.eventFilter(self, watched, event)

    def adjustSize(self):
        # move widget to topright
        self.move(self.parentWidget().width() -self.width()-5, 5)


class Notifier(QtGui.QWidget):
    def __init__(self, message=None):
        QtGui.QWidget.__init__(self, flags=QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint)
        _desktop = QtGui.QApplication.desktop()
        size = _desktop.screenGeometry().size()

        self.resize(size.width() * 25 / 100, size.height() * 3 / 100)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.main_layout = QtGui.QVBoxLayout(self)
        self.move(size.width() - (size.width() * 25 / 100) - 10, 50)

        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.main_layout.setSpacing(0)

        self.label = QtGui.QLabel(message)
        self.label.setStyleSheet("color: lightgreen; font: 14px;")
        self.label.setIndent(20)
        self.main_layout.addWidget(self.label)
        cross = CloseCrosss(parent=self)
        cross.clicked.connect(self.close)


    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing, True)
        qp.setPen(QtGui.QColor(255, 255, 255, 200))
        qp.setBrush(QtGui.QColor(0, 0, 0, 200))
        qp.drawRoundedRect(QtCore.QRect(QtCore.QPoint(), self.size()), 5, 5)


if __name__ == "__main__":
    QApp = QtGui.QApplication(sys.argv)
    window = Notifier("Hello World")
    window.show()
    sys.exit(QApp.exec_())

enter image description here

...