MDI 区域中心的 PyQt 用户徽标

PyQt user logo in center of MDI Area

我一直在研究 PyQt QMainWindow QMdiArea Class。我已经能够根据我的应用程序的需要更改背景颜色。 但是,我无法在 window.

的中心添加徽标

我试过 QBrush,但只能完整插入徽标 QMdiArea。 此外,我尝试了 paintEvent 重写方法,但这似乎不起作用。

请在下面找到我的代码和代码输出的快照:

# Import necessary libraries
import sys

from PyQt5 import QtWidgets, QtGui
from PyQt5.QtGui import QColor, QBrush, QPainter
from PyQt5.QtWidgets import QStyleFactory, QWidget, QMainWindow, QMdiArea


class MDI_Window(QMainWindow, QWidget):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget(self)
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)

        self.window_initialize()
        self.show()

    def window_initialize(self):
        title = 'MDI'
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon("Some_Icon.png"))
        self.setMinimumSize(800, 600)

        self.mdi.setBackground(QBrush(QColor(169, 169, 169)))

        self.showMaximized()

    def paintEvent(self, event):
        self.mdi.paintEvent(event)
        self.painter = QPainter(self)
        # For testing logo
        self.painter.drawPixmap(500, 500, 500, 500, QtGui.QPixmap("KDS_Main-Window.png"))


if __name__ == "__main__":
    # Create App with the design
    LMS_App = QtWidgets.QApplication(sys.argv)
    LMS_App.setStyle(QStyleFactory.create('Fusion'))

    a = MDI_Window()
    # Exit application when system is terminated
    sys.exit(LMS_App.exec_())

你不能像那样实现 paintEvent,主要是因为 Qt and 调用了一个 paintEvent has正在绘制的特定小部件。绘制事件必须在小部件中实现。

最简单的解决方案是将 QMdiArea 子类化:

class MdiArea(QMdiArea):
    def paintEvent(self, event):
        # call the base implementation to draw the default colored background
        super().paintEvent(event)
        # create the painter *on the viewport*
        painter = QPainter(self.viewport())
        painter.drawPixmap(500, 500, 500, 500, QtGui.QPixmap("KDS_Main-Window.png"))

注意:

  1. 您现在应该删除主要 window 的 paintEvent
  2. 如您所见,画家在视口上被调用:这对于all QAbstractScrollArea 子类是必需的;
  3. paintEvent中使用的QPainter实例应该设置为实例属性(如你所见,我没有使用self.painter),因为画家必须在函数结束时被销毁,否则你将面临性能和绘图问题;理论上你可以通过手动调用 painter.end() 来避免这个问题,但是,由于一个新的 QPainter 实例很可能很快并且经常被重新创建,所以每次都将其设置为持久属性实际上没有用。