Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pyqt5的QMainWindow中的背景图像上放置小部件?_Python_Pyqt5 - Fatal编程技术网

Python 如何在Pyqt5的QMainWindow中的背景图像上放置小部件?

Python 如何在Pyqt5的QMainWindow中的背景图像上放置小部件?,python,pyqt5,Python,Pyqt5,我有一个定制的LED指示器小部件(来自github),它在QMainWindow上看起来像这样: 我有一个图像可以放在Qmain窗口的背景中,如下所示: 现在我的问题是,如何将LED指示灯小部件放在背景图像上(我想将它们放在所有框中)?当我在程序中放置背景图像时,LED指示灯小部件根本不显示。 代码如下: import sys from LedIndicatorWidget import * from PyQt5 import QtCore, QtWidgets from PyQt5.QtW

我有一个定制的LED指示器小部件(来自github),它在QMainWindow上看起来像这样:

我有一个图像可以放在Qmain窗口的背景中,如下所示:

现在我的问题是,如何将LED指示灯小部件放在背景图像上(我想将它们放在所有框中)?当我在程序中放置背景图像时,LED指示灯小部件根本不显示。

代码如下:

import sys
from LedIndicatorWidget import *
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QCheckBox, QWidget
from PyQt5.QtCore import QSize    

class ExampleWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(300, 300))    
        self.setWindowTitle("Checkbox")

        oImage = QImage("map.png")
        sImage = oImage.scaled(QSize(800,277))                   
        palette = QPalette()
        palette.setBrush(QPalette.Window, QBrush(sImage))                        
        self.setPalette(palette)

        self.show()

    
    

        self.led = LedIndicator(self)
        self.led.setDisabled(True)  
    
    
        self.led.move(10,20)
        self.led.resize(100,100)

        self.led1 = LedIndicator(self)
        self.led1.setDisabled(True)  
    
    
        self.led1.move(150,20)
        self.led1.resize(100,100)

        self.led2 = LedIndicator(self)
        self.led2.setDisabled(True)  
    
    
        self.led2.move(300,20)
        self.led2.resize(100,100)
    
    
    
        self.timer = QtCore.QTimer()
    
    
        self.timer.timeout.connect(self.onPressButton)
        self.timer.start()
    


    def onPressButton(self):
    
    
        self.led.setChecked(not self.led.isChecked())
        self.timer.stop()
     
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = ExampleWindow()
    mainWin.show()
    sys.exit( app.exec_() )
我已将Qpalete用作背景图像,如果您有更好的想法添加图像并使其工作,请随意添加,因为我找不到。

要使用LED指示器小部件,请创建一个文件“LedIndicatorWidget.py”并复制以下代码:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class LedIndicator(QAbstractButton):
    scaledSize = 1000.0

    def __init__(self, parent=None):
        QAbstractButton.__init__(self, parent)

        self.setMinimumSize(24, 24)
        self.setCheckable(True)

        # Green
        self.on_color_1 = QColor(0, 255, 0)
        self.on_color_2 = QColor(0, 192, 0)
        self.off_color_1 = QColor(0, 28, 0)
        self.off_color_2 = QColor(0, 128, 0)

    def resizeEvent(self, QResizeEvent):
        self.update()

    def paintEvent(self, QPaintEvent):
        realSize = min(self.width(), self.height())

        painter = QPainter(self)
        pen = QPen(Qt.black)
        pen.setWidth(1)

        painter.setRenderHint(QPainter.Antialiasing)
        painter.translate(self.width() / 2, self.height() / 2)
        painter.scale(realSize / self.scaledSize, realSize / self.scaledSize)

        gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500))
        gradient.setColorAt(0, QColor(224, 224, 224))
        gradient.setColorAt(1, QColor(28, 28, 28))
        painter.setPen(pen)
        painter.setBrush(QBrush(gradient))
        painter.drawEllipse(QPointF(0, 0), 500, 500)

        gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500))
        gradient.setColorAt(0, QColor(224, 224, 224))
        gradient.setColorAt(1, QColor(28, 28, 28))
        painter.setPen(pen)
        painter.setBrush(QBrush(gradient))
        painter.drawEllipse(QPointF(0, 0), 450, 450)

        painter.setPen(pen)
        if self.isChecked():
            gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500))
            gradient.setColorAt(0, self.on_color_1)
            gradient.setColorAt(1, self.on_color_2)
        else:
            gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500))
            gradient.setColorAt(0, self.off_color_1)
            gradient.setColorAt(1, self.off_color_2)

        painter.setBrush(gradient)
        painter.drawEllipse(QPointF(0, 0), 400, 400)

    @pyqtProperty(QColor)
    def onColor1(self):
        return self.on_color_1

    @onColor1.setter
    def onColor1(self, color):
        self.on_color_1 = color

    @pyqtProperty(QColor)
    def onColor2(self):
        return self.on_color_2

    @onColor2.setter
    def onColor2(self, color):
        self.on_color_2 = color

    @pyqtProperty(QColor)
    def offColor1(self):
        return self.off_color_1

    @offColor1.setter
    def offColor1(self, color):
        self.off_color_1 = color

    @pyqtProperty(QColor)
    def offColor2(self):
        return self.off_color_2

    @offColor2.setter
    def offColor2(self, color):
        self.off_color_2 = color

问题与背景无关:LED小部件就在那里,问题是添加到父级的小部件(以及使用布局管理器添加到父级的小部件)不会使它们可见,并且必须通过调用
show()
setVisible(True)
来显式显示它们

如果在设置调色板后删除
self.show()
行(但在末尾保留
mainWin.show()
),则可以看到差异:在这种情况下,LED将自动可见


解决方案是显式显示子窗口小部件,或者在添加它们后在父窗口小部件上调用
show()
/
setVisible(True)

只是澄清一下,问题是您看不到LED吗?@musicamante是的,这就是问题所在。我想在图像上看到它们。编辑:如果我不使用背景图像,所有的LED都会显示并且工作正常。一旦我放置了背景图像,我就看不到它们了。背景图像与它无关,当你不设置它时,你可能还会删除/注释第一个
self.show()
调用,这就是原因。