在PyQt的菜单栏下面显示图片

2 人关注

我有一个简单的流程:用户点击一个按钮,一个QDialog弹出,我希望渲染一个MenuBar和MenuBar下面的一个图片(渲染发生在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()的调用上,因为它似乎在使用整个窗口,但我希望菜单栏能在 "窗口外"。

python
python-3.x
pyqt
pyqt5
qmenubar
Kristijan
Kristijan
发布于 2019-06-19
2 个回答
eyllanesc
eyllanesc
发布于 2019-06-19
已采纳
0 人赞同

一个可能的解决方案是给出一个类似于以下所示的偏移量 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)
# ...
    
这是我试着做的,但由于某些原因,它不能自己调整大小,用sizeHint可以。谢谢。
我刚刚用一张更大的图片试了一下,看来它还是根据工具栏的大小,以一个偏移量来挤压高度。
@Kristijan 你有多大的图片?如果你能分享图片,以分析问题所在,从而改进我的解决方案,那就太好了。
我试着用的图片是892 x 852 px - 如果需要,我可以把它发给你
@Kristijan 你也可以分享一下你的窗口的截图,以便更好地了解你的问题
S. Nick
S. Nick
发布于 2019-06-19
0 人赞同

Try it:

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()