插入在另一个 class 中创建的 Pixmap

Insert a Pixmap created in another class

我正在尝试创建一个 QMainWindow 并在其中添加一些 QDockWidgetQPushButtons 和图像。我在不同的 class 中创建了图像,以便稍后添加一些特征。

我需要将按钮和图像放在 QMainWindow 的左侧。像这样:

如您所见,那里有一些 QPushButton 和每个 QDockWidget 中都有一个 matplotlib 图。

当我想添加图像时,问题就来了。我需要它位于 QMainWindow.

的左下角

这是部分代码:

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 文件,然后 运行 这个代码(这个是你的代码,有一些小改动):

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

请 运行 这个代码,如果它对你有用请告诉我。

第二次编辑

这里有一些额外的注释来让它工作:

(1) .png 文件应该是 'genuine' .png 文件。仅仅将 .jpg 文件重命名为 .png 文件是行不通的。我试过了。

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

第三次编辑

即使使用画图将您的 .jpg 图片转换为 .png 图片也不行。如果还是报错,请到本站下载正版.png格式图片。并用那个试一试: http://www.flaticon.com/free-icon/mortarboard_123402