1

我一直在研究 PyQtQMainWindow QMdiArea类。我已经能够根据我的应用程序的需要更改背景颜色。但是,我无法在窗口中心添加徽标​​。

我已经尝试过 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_())

带有徽标所需区域的程序输出

4

1 回答 1

2

您不能实现paintEvent类似的东西,主要是因为必须由 Qt 调用paintEvent以及正在绘制的特定小部件。绘制事件必须在小部件中实现。

最简单的解决方案是将 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. 你现在应该删除paintEvent主窗口的;
  2. 如您所见,在视口上调用了画家:这对于所有QAbstractScrollArea 子类都是强制性的;
  3. a 中使用的 QPainter 实例paintEvent应该设置为实例属性(如你所见,我没有使用),因为painter必须在函数结束时销毁,否则会面临性能和绘图问题;理论上你可以通过手动调用来避免这个问题,但是,由于一个新的 QPainter 实例很可能会很快而且很频繁地重新创建,因此每次将其设为持久属性真的没有用。self.painterpainter.end()
于 2020-08-05T15:04:18.457 回答