Python Qlabel中的Pixmap图像大小

Python Qlabel中的Pixmap图像大小,python,pyqt,pyqt4,qlabel,Python,Pyqt,Pyqt4,Qlabel,我试图让图像完全符合我的标签,而不使用setScaledContents(True),因为我希望我的ImageGrab具有与QLabel空间完全相同的尺寸 我使用带bbox的PIL ImageGrab。如果我偶然将参数设置为更宽和更高的宽度,它将使程序崩溃而不会出现任何错误。我附上了一张图片,其中标签中的图像位于左中心。我想把它放在左上角。因此,如果我增大尺寸,它可以向下和向右扩展 但是我很好奇为什么我不能增加bbox的尺寸。(0、0、400、220)工作正常,但(0、0、420、220)不会上

我试图让图像完全符合我的标签,而不使用
setScaledContents(True)
,因为我希望我的ImageGrab具有与QLabel空间完全相同的尺寸

我使用带bbox的PIL ImageGrab。如果我偶然将参数设置为更宽和更高的宽度,它将使程序崩溃而不会出现任何错误。我附上了一张图片,其中标签中的图像位于左中心。我想把它放在左上角。因此,如果我增大尺寸,它可以向下和向右扩展

但是我很好奇为什么我不能增加bbox的尺寸。(0、0、400、220)工作正常,但(0、0、420、220)不会上载图像并关闭GUI,不会出现任何错误

我想要一个带有bbox(0,0,800700)的ImageGrab和一个大小为(800700)的QLabel,这样它就可以完美地安装它

class Main(QMainWindow):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.setGeometry(200, 200, 1000, 700)
        self.setWindowTitle('threads')

        self.mainFrame = QFrame(self)
        self.mainFrame.resize(1000, 650)
        self.mainFrame.move(0, 50)
        self.mainFrame.setStyleSheet("background-color: rbg(50, 50, 50)")

        self.testButton = QPushButton("Click", self)
        self.testButton.resize(500,30)
        self.connect(self.testButton, SIGNAL("clicked()"), self.Capture)    

        self.label_ = QLabel(self.mainFrame)
        self.label_.move(10, 10)
        self.label_.resize(980, 630)
        self.label_.setStyleSheet("background-color: rbg(150, 150, 150)")

    @pyqtSlot(QImage) 
    def ChangeFrame(self, image):  

        pixmap = QPixmap.fromImage(image)           
        self.label_.setPixmap(pixmap)

    def Capture(self):       
        self.thread_ = CaptureScreen()        
        self.connect(self.thread_, SIGNAL("ChangeFrame(QImage)"), self.ChangeFrame, Qt.QueuedConnection)
        self.thread_.start()     


class CaptureScreen(QThread):
    pixmap = pyqtSignal(QImage)

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

    def __del__(self):
        print("?????")
        self.exiting = True
        self.wait()

    def run(self):         
        while(True):
            time.sleep(1/60)

            img = ImageGrab.grab(bbox=(0, 0, 420, 220))

            frame = ImageQt(img)
            frame = QImage(frame)

            self.emit( SIGNAL("ChangeFrame(QImage)"), frame)

解决方案是使用布局,并在
QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft
中设置对齐方式

我还建议使用新的连接语法,另一方面,如果要在构造函数中从QMainWindow继承,则必须调用它。最后,当您使用QMainWindow时,必须设置一个中心小部件

import time
from PyQt4 import QtCore, QtGui
from PIL import ImageGrab, ImageQt


class Main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(200, 200, 1000, 700)
        self.setWindowTitle('threads')

        main_widget = QtGui.QWidget()
        self.setCentralWidget(main_widget)

        lay = QtGui.QVBoxLayout(main_widget)
        self.testButton = QtGui.QPushButton("Click")
        self.testButton.setFixedHeight(30)
        self.testButton.clicked.connect(self.capture)

        mainFrame = QtGui.QFrame()
        mainFrame.setStyleSheet("background-color: rbg(50, 50, 50)")

        _lay = QtGui.QVBoxLayout(mainFrame)
        _lay.setContentsMargins(0, 0, 0, 0)
        self.label_ = QtGui.QLabel()
        _lay.addWidget(self.label_, 0, QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)

        lay.addWidget(self.testButton)
        lay.addWidget(mainFrame)

    @QtCore.pyqtSlot(QtGui.QImage) 
    def changeFrame(self, image):  
        pixmap = QtGui.QPixmap.fromImage(image)           
        self.label_.setPixmap(pixmap)

    @QtCore.pyqtSlot() 
    def capture(self):       
        self.thread_ = CaptureScreen()       
        self.thread_.changedFrame.connect(self.changeFrame, QtCore.Qt.QueuedConnection)
        self.thread_.start()     
        self.testButton.setDisabled(True)


class CaptureScreen(QtCore.QThread):
    changedFrame = QtCore.pyqtSignal(QtGui.QImage)

    def __del__(self):
        print("?????")
        self.exiting = True
        self.quit()
        self.wait()

    def run(self):         
        while True:
            time.sleep(1/60)
            w, h = 420, 220
            img = ImageGrab.grab(bbox=(0, 0, w, h))
            frame = ImageQt.toqimage(img)
            self.changedFrame.emit(QtGui.QImage(frame))


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())

如果您调用
run()
?,请提供一个@eyllansc,我用我的代码更新了它。谢谢。我没有足够的话来感谢你。你解决了它并超越了:)非常感谢!这是一个有点奇怪的适应这些信号和插槽。但这看起来更干净:D@vandelay我忘了提到它,现在建议使用新的连接语法,因为您可以看到它更可读。是的,我也实现了它。看起来整洁多了。谢谢:o)