首页 > 解决方案 > PyQt 在现有的前面动态添加小部件

问题描述

我要归档的是创建一个(像素图-)小部件,然后在主小部件前面可见。稍后,这个小部件应该跟随鼠标。

所以我的主要问题是在按下空格键时动态创建一个小部件,然后在其他小部件前面可见,而不创建单独的窗口。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.label = QtWidgets.QLabel()
        canvas = QtGui.QPixmap(1200, 800)
        canvas.fill(QtGui.QColor('#ffffff')) # Fill entire canvas.
        self.label.setPixmap(canvas)
        self.setCentralWidget(self.label)

        self.last_x, self.last_y = None, None


    def mouseMoveEvent(self, e):
        if self.last_x is None: # First event.
            self.last_x = e.x()
            self.last_y = e.y()
            return # Ignore the first time.

        painter = QtGui.QPainter(self.label.pixmap())
        painter.drawLine(self.last_x, self.last_y, e.x(), e.y())
        painter.end()
        self.update()

        # Update the origin for next time.
        self.last_x = e.x()
        self.last_y = e.y()

    def mouseReleaseEvent(self, e):
        self.last_x = None
        self.last_y = None

    def keyPressEvent(self, QKeyEvent):
        if QKeyEvent.key() == Qt.Key_Space:
            block = QtGui.QPixmap(20, 20)
            block.fill(QtGui.QColor('blue'))
            self.image = QtWidgets.QLabel()
            self.image.setPixmap(block)
            self.image.move(20,20)
            # self.image.raise_()
            # self.image.show()

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

如果我在图像上调用 .show() 的位置,将打开一个带有此小部件的单独窗口。但这不是我想要存档的。_raise 似乎根本没有做任何事情。

编辑:我可以通过使用 QStackedLayout 来实现吗?

标签: pythonuser-interfacepyqtpyqt5widget

解决方案


没有父级的小部件将显示为窗口,因此解决方案是将其传递给父级并调用 show() 方法来显示它:

def keyPressEvent(self, QKeyEvent):
    if QKeyEvent.key() == Qt.Key_Space:
        block = QtGui.QPixmap(20, 20)
        block.fill(QtGui.QColor('blue'))
        self.image = QtWidgets.QLabel(self.label)
        self.image.setPixmap(block)
        self.image.move(20,20)
        self.image.show()

推荐阅读