1

pyQt を使用して画像を表示する次のコードがあります。

app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()

window.setGeometry(opts.posx, opts.posy, opts.width, opts.height)

pic = QtGui.QLabel(window)
pic.setGeometry(5, 5, opts.width-10, opts.height-10)
pixmap = QtGui.QPixmap(opts.filename)
pixmap = pixmap.scaledToHeight(opts.height)
pic.setPixmap(pixmap)

window.show()
sys.exit(app.exec_())

このコードをおそらくクラスの形式でラップし、実行時にシグナル、ソケット、よくわからないスレッドを使用して別のイメージを設定できるようにしたいと考えています。私は次のようなものを想像します:

class MyImage(object):
   def __init(self, args):
       some setup code
       self.pic = whatever
   def set_image(self, filename):
       pixmap = QtGui.QPixmap(opts.filename)
       pixmap = pixmap.scaledToHeight(opts.height)
       pic.setPixmap(pixmap)

元のコードを呼び出すsys.exit(app.exec_())と、コードが「フリーズ」します。しかし、実行中の別の Python コードからシグナル (およびファイル名) を送信したいと考えています。これを簡単かつ簡単に処理する方法について何か提案はありますか? 多分app.exec_メソッドを上書きしますか?

4

1 に答える 1

1

このようなものがあなたのために働くはずです:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

from PyQt4 import QtGui, QtCore

class ImageChanger(QtGui.QWidget):    
    def __init__(self, images, parent=None):
        super(ImageChanger, self).__init__(parent)        

        self.comboBox = QtGui.QComboBox(self)
        self.comboBox.addItems(images)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.comboBox)

class MyWindow(QtGui.QWidget):
    def __init__(self, images, parent=None):
        super(MyWindow, self).__init__(parent)
        self.label = QtGui.QLabel(self)

        self.imageChanger = ImageChanger(images)
        self.imageChanger.move(self.imageChanger.pos().y(), self.imageChanger.pos().x() + 100)
        self.imageChanger.show()
        self.imageChanger.comboBox.currentIndexChanged[str].connect(self.changeImage)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.label)

    @QtCore.pyqtSlot(str)
    def changeImage(self, pathToImage):
        pixmap = QtGui.QPixmap(pathToImage)
        self.label.setPixmap(pixmap)


if __name__ == "__main__":
    import sys

    images = [  "/path/to/image/1",
                "/path/to/image/2",
                "/path/to/image/3",
                ]

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow(images)
    main.show()

    sys.exit(app.exec_())
于 2013-01-16T21:19:26.593 に答える