Отображение изображения под меню в PyQt - PullRequest
2 голосов
/ 19 июня 2019

У меня простой процесс: пользователь нажимает кнопку, появляется всплывающее окно QDialog, и я хочу отобразить панель меню и изображение под панелью меню (рендеринг происходит во время paintEvent).

import sys

from PyQt5 import QtGui
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QDialog, QMenuBar, QAction, QHBoxLayout


class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.button = QPushButton()
        self.button.setText("Click")
        self.button.setMaximumHeight(100)
        self.button.setMaximumWidth(100)
        self.button.clicked.connect(self.clicked)

        self.layout().addWidget(self.button)

        self.show()

    def clicked(self):
        self.something = SecondExample()
        self.something.exec()

class SecondExample(QDialog):
    def __init__(self):
        super().__init__()
        self.installEventFilter(self)

        layout = QHBoxLayout()

        toolbar = QMenuBar()
        toolbar.addAction(QAction("Edit", toolbar))
        toolbar.addAction(QAction("Polygon", toolbar))
        toolbar.addAction(QAction("Rectangle", toolbar))

        layout.setMenuBar(toolbar)

        self.setLayout(layout)

        self.pixmap = QPixmap(r"C:\Users\kjankosk\Desktop\Panasonic-OLED-TV-FZ950-Lifestyle.jpg")
        self.resize(self.pixmap.width(), self.pixmap.height())


    def paintEvent(self, event):
        super().paintEvent(event)

        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)

        painter.drawPixmap(self.rect(), self.pixmap)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

ЗдесьЭто воспроизводимый пример того, что у меня есть (редактирование пути к изображению), однако часть изображения появляется за строкой меню.Как я могу исправить эту проблему?Я думаю, что основная проблема заключается в вызове rect (), так как кажется, что он использует все окно, но я надеялся, что строка меню будет «вне окна»

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Возможное решение состоит в том, чтобы задать смещение, подобное указанному S.Nick , но, как вы видели, недостатком в первую очередь является вычисление смещения, которое зависит от стиля и ОС. Поэтому еще одно возможное решение - создать другой виджет, в котором отображается изображение, и добавить его в макет:

# ...
class Widget(QWidget):
    def __init__(self):
        super().__init__()

        self.pixmap = QPixmap(
            r"C:\Users\kjankosk\Desktop\Panasonic-OLED-TV-FZ950-Lifestyle.jpg"
        )

    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
        painter.drawPixmap(self.rect(), self.pixmap)

    def sizeHint(self):
        return self.pixmap.size()


class SecondExample(QDialog):
    def __init__(self):
        super().__init__()

        layout = QHBoxLayout(self)

        toolbar = QMenuBar()
        toolbar.addAction(QAction("Edit", toolbar))
        toolbar.addAction(QAction("Polygon", toolbar))
        toolbar.addAction(QAction("Rectangle", toolbar))

        layout.setMenuBar(toolbar)

        widget = Widget()
        layout.addWidget(widget)
# ...
0 голосов
/ 19 июня 2019

Попробуйте:

import sys
from PyQt5 import QtGui
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (QMainWindow, QApplication, QPushButton, QDialog, 
                             QMenuBar, QAction, QHBoxLayout, QWidget, QGridLayout)

class SecondExample(QDialog):
    def __init__(self):
        super().__init__()
        self.installEventFilter(self)

        toolbar = QMenuBar()
        toolbar.addAction(QAction("Edit", toolbar))
        toolbar.addAction(QAction("Polygon", toolbar))
        toolbar.addAction(QAction("Rectangle", toolbar))

        layout = QHBoxLayout()
        layout.setMenuBar(toolbar)
        self.setLayout(layout)

        self.pixmap = QPixmap("D:/_Qt/__Qt/img/max1.jpg")      # py-qt.png
        self.resize(self.pixmap.width(), self.pixmap.height())

    def paintEvent(self, event):
        super().paintEvent(event)

        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)

#        painter.drawPixmap(self.rect(), self.pixmap)
        rect = self.rect().x(), self.rect().y()+20, self.rect().width(), self.rect().height()-20 # +++
        painter.drawPixmap(*rect, self.pixmap)                                                   # +++


class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.button = QPushButton(self)
        self.button.setText("Click")
        self.button.setMaximumHeight(100)
        self.button.setMaximumWidth(100)
        self.button.clicked.connect(self.clicked)

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        layout = QGridLayout(centralWidget)
#        self.layout().addWidget(self.button)
        layout.addWidget(self.button)

    def clicked(self):
        self.something = SecondExample()
        self.something.show()            # exec()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

enter image description here

...