Пользователь PyQt lo go в центре области MDI - PullRequest
1 голос
/ 05 августа 2020

Я работал над PyQt QMainWindow QMdiArea Class. Мне удалось изменить цвет фона, как это необходимо для моего приложения. Однако я не могу добавить lo go в центр окна.

Я пробовал QBru sh, но просто вставил lo go полностью 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_())

Вывод программы с областью, необходимой для Lo go

1 Ответ

2 голосов
/ 05 августа 2020

Вы не можете реализовать paintEvent таким образом, в основном потому, что paintEvent имеет для вызова Qt и для указанного виджета c, который отрисовывается. Событие рисования должно быть реализовано в виджете.

Самое простое решение - создать подкласс 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. экземпляры QPainter, используемые в paintEvent, должны не быть установлены как атрибуты экземпляра (как вы можете видеть, я не использовал self.painter), поскольку Painter должен быть уничтожен в конце функции, иначе вы столкнетесь с проблемами производительности и рисования; теоретически вы можете избежать этой проблемы, вручную вызвав painter.end(), но, поскольку новый экземпляр QPainter, скорее всего, будет воссоздан очень скоро и очень часто, делать его постоянным атрибутом каждый раз действительно бесполезно.
...