Python 插入在另一个类中创建的Pixmap

Python 插入在另一个类中创建的Pixmap,python,pyqt,qpixmap,Python,Pyqt,Qpixmap,我正在尝试创建一个QMainWindow,并在其中添加一些QDockWidget,QPushButtons和一个图像。我在另一个类中创建了该图像,以便稍后添加一些特征 我需要将按钮和图像放在qmain窗口的左侧。大概是这样的: 如您所见,这里有一些QPushButton,还有QDockWidget,其中每个都有一个matplotlib图 当我想添加图像时,问题就出现了。我需要它位于qmain窗口的左下角 这是代码的一部分: class MainWindow(QMainWindow): de

我正在尝试创建一个
QMainWindow
,并在其中添加一些
QDockWidget
QPushButtons
和一个图像。我在另一个类中创建了该图像,以便稍后添加一些特征

我需要将按钮和图像放在
qmain窗口的左侧
。大概是这样的:

如您所见,这里有一些
QPushButton
,还有
QDockWidget
,其中每个都有一个matplotlib图

当我想添加图像时,问题就出现了。我需要它位于
qmain窗口的左下角

这是代码的一部分:

class MainWindow(QMainWindow):
  def __init__(self):
    super(MainWindow, self).__init__()

    self.my_widget = QWidget()
    self.setCentralWidget(self.my_widget)

    self.createDockWindows()
    self.createButtons()

  def createDockWindows(self):
    #Here I create two QDockWidget and
    #I add into them a matplotlib figure created in another class

    self.fig1 = mpl_Canvas()    #This is the matplotlib figure`s class
    self.fig2 = mpl_Canvas()

    dock1.setWidget(self.fig1)
    dock2.setWidget(self.fig2)

    self.addDockWidget(Qt.RightDockWidgetArea, dock1)
    self.addDockWidget(Qt.RightDockWidgetArea, dock2)

def createButtons(self):
    #Here i add some buttons  
    layout = QVBoxLayout()

    self.r_btn = QRadioButton()
    self.r_btn.setGeometry(10, 50, 10, 30)
    self.r_btn.setText("RadioButton 1")

    ###HERE IS WHERE I NEED TO ADD THE IMAGE FROM THE CREATEIMAGE CLASS###

    self.image = createImage()

    layout.addWidget(self.r_btn)
    layout.addWidget(self.image)

    self.my_widget.setLayout(layout)

class createImage(QWidget):
  def __init__(self):
    QWidget.__init__(self)

    self.showImage()

  def showImage(self):
    self.label = QLabel()
    self.img = QPixmap("image.jpg")
    self.img_scaled = self.img.scaled(self.label.size(),Qt.KeepAspectRatio)

    self.label.setPixmap(self.img_scaled)
我该怎么做?我知道我做错了什么,但我找不到错误

希望你能帮助我

--------编辑--------- 这是经过@K.Mulier修改的代码:

class MainWindow(QMainWindow):
  def __init__(self):
    super(MainWindow, self).__init__()

    self.my_widget = QWidget()
    self.setCentralWidget(self.my_widget)

    self.createDockWindows()
    self.createButtons()

  def createDockWindows(self):
    dock1 = QDockWidget("Osciloscope",self)
    dock1.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)

    dock2 = QDockWidget("Espectrometer", self)
    dock2.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable
        | QDockWidget.DockWidgetClosable)

    dock1.setMinimumSize(800,100)
    dock2.setMinimumSize(800,100)

    self.fig1 = mpl_Canvas()
    self.fig2 = mpl_Canvas()

    dock1.setWidget(self.fig1)
    dock2.setWidget(self.fig2)

    self.addDockWidget(Qt.RightDockWidgetArea, dock1)
    self.addDockWidget(Qt.RightDockWidgetArea, dock2)

  def createButtons(self):
    layout = QVBoxLayout()

    self.r_btn = QRadioButton()
    self.r_btn.setGeometry(10, 50, 10, 30)
    self.r_btn.setText("RadioButton 1")

    self.image = createImage()

    layout.addWidget(self.r_btn)
    layout.addWidget(self.image)

    self.my_widget.setLayout(layout)

class createImage(QWidget):
  def __init__(self):
    super(createImage, self).__init__(parent = None)
    self.mainLayout = QHBoxLayout()
    self.setLayout(self.mainLayout)

    self.showImage()


  def showImage(self):

    picPath = os.getcwd() + "C:\Users\Flosh\Desktop\hello.png"
    print picPath
    picMap = QPixmap(picPath)

    picLabel = QLabel(parent = None)
    picLabel.setGeometry(10,10,800,600)
    picLabel.setPixmap(picMap.scaled(780,580,Qt.KeepAspectRatio))
    self.mainLayout.addWidget(picLabel)

class mpl_canvas(self):
  #A matplotlib figure
编辑-问题已解决 最后一段代码中的问题在于以下几行:

picPath = os.getcwd() + "C:\somedirectory\image.png"
print picPath
picMap = QPixmap(picPath) 
必须将
picMap=QPixmap(picPath)
中的
picPath
替换为如下图像位置:

picMap=QPixmap(C:\somedirectory\image.png”)
试试这个:

class MyImage(QWidget):

    def __init__(self):
        super(MyImage, self).__init__(parent = None)
        self.mainLayout = QtGui.QHBoxLayout()
        self.setLayout(self.mainLayout)
        self.setPicture()

    def setPicture(self):
        picPath = os.getcwd() + "/someFolder/image.jpg"
        print(picPath) # Check if the path to your picture is correct.
        picMap = QtGui.QPixmap(picPath)

        picLabel = QtGui.QLabel(parent = None)
        picLabel.setGeometry(10,10,800,600)
        picLabel.setPixmap(picMap.scaled(780,580,QtCore.Qt.KeepAspectRatio))
        self.mainLayout.addWidget(picLabel)
如果你还有什么问题,尽管问,我很乐意帮你

编辑

我已经在您的代码上进行了测试。显然,它不适用于.jpg文件,只适用于.png文件。因此,您应该将图片转换为.png文件,然后运行此代码(这是您的代码,有一些小改动):

请运行此代码,并让我知道它是否适用于您

第二次编辑

下面是一些额外的备注,以使其发挥作用:

(1) .png文件应该是“正版”.png文件。只需将.jpg文件重命名为.png文件是行不通的。我已经尝试过了

(2) 请不要忘记,
os.getcwd()
已经暗示了路径的很大一部分。因此,检查print语句的输出非常重要:
print(picPath)
。检查此路径是否正确引用了您的图片

第三次编辑

即使使用Paint将.jpg图片转换为.png图片也不起作用。如果仍然出现错误,请访问此网站下载正版.png格式的图片。然后用该图片再试一次:

谢谢你的回答和时间。我编写了你的代码,我得到了以下错误:
QPixmap::scaled:Pixmap是一个空的Pixmap
并且它不显示图片。这是因为.png格式吗?嗨,Pablo,请确保你的图片是一个.png文件,并且picPath是正确的(包括文件名,应该以.png结尾)是的。这是路径:
picPath=os.getcwd()+“C:\Users\Flosh\Desktop\hello.png”
Hi Pablo,.png文件应该是一个“正版的”.png文件。只需将.jpg文件重命名为.png文件是行不通的。我已经尝试过了。干得好,Pablo!我很高兴你的问题现在得到解决:-)亲切的问候,
import os
import sys

from PyQt4.QtGui import QMainWindow
from PyQt4.QtGui import QWidget
from PyQt4.QtGui import QLabel
from PyQt4.QtGui import QDockWidget
from PyQt4.QtGui import QVBoxLayout
from PyQt4.QtGui import QRadioButton
from PyQt4.QtGui import QPixmap
from PyQt4 import QtGui
from PyQt4 import QtCore

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.my_widget = QWidget()
        self.setCentralWidget(self.my_widget)

        self.createDockWindows()
        self.createButtons()

        self.show()

    def createDockWindows(self):
        #Here I create two QDockWidget and
        #I add into them a matplotlib figure created in another class

        # I do not have your matplotlib figures, so I've inserted
        # some labels instead.
        self.fig1 = QLabel("Hello")    #This is the matplotlib figure`s class
        self.fig2 = QLabel("World")

        dock1 = QDockWidget()
        dock2 = QDockWidget()

        dock1.setWidget(self.fig1)
        dock2.setWidget(self.fig2)

        self.addDockWidget(0x2, dock1)
        self.addDockWidget(0x2, dock2)

    def createButtons(self):
        #Here i add some buttons  
        layout = QVBoxLayout()

        self.r_btn = QRadioButton()
        self.r_btn.setGeometry(10, 50, 10, 30)
        self.r_btn.setText("RadioButton 1")

        ###HERE IS WHERE I NEED TO ADD THE IMAGE FROM THE CREATEIMAGE CLASS###

        self.image = MyImage()

        layout.addWidget(self.r_btn)
        layout.addWidget(self.image)

        self.my_widget.setLayout(layout)

class MyImage(QWidget):

    def __init__(self):
        super(MyImage, self).__init__(parent = None)
        self.mainLayout = QtGui.QHBoxLayout()
        self.setLayout(self.mainLayout)
        self.setPicture()

    def setPicture(self):
        # For some reason, it only works on .png files, not on .jpg files!
        picPath = os.getcwd() + "\someFolder\myImage.png"
        print(picPath) # Check if the path to your picture is correct.
        picMap = QtGui.QPixmap(picPath)

        picLabel = QtGui.QLabel(parent = None)
        picLabel.setGeometry(10,10,800,600)
        picLabel.setPixmap(picMap.scaled(780,580,QtCore.Qt.KeepAspectRatio))
        self.mainLayout.addWidget(picLabel)


if __name__== '__main__':
    app = QtGui.QApplication(sys.argv)
    QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Plastique'))
    myGUI = MainWindow()

    sys.exit(app.exec_())