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