• 3676阅读
  • 4回复

PYQT4 Qtable加载图片问题 [复制链接]

上一主题 下一主题
离线lason123
 

只看楼主 倒序阅读 楼主  发表于: 2017-07-13
高手们好,我在qlabel上放置图片,如果换不同的图片需要用到self.label.repaint(),不然显示不出来,这是为什么

        self.b=QPixmap("D:/grey.png")
        self.label.setScaledContents(True)
        self.label.setPixmap(self.b)
        self.label.repaint()
        time.sleep(2)
        self.n=QPixmap("D:/red.png")
        self.label.setScaledContents(True)
        self.label.setPixmap(self.n)
        self.label.repaint()
离线linote

只看该作者 1楼 发表于: 2017-07-13
我不是高手,但我想试解答一下你的问题。
我从网上抄了一段代码:
#coding:utf-8
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore


class SliderLabel(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Slider Label')
        self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        self.slider.setFocusPolicy(QtCore.Qt.NoFocus)
        self.slider.setGeometry(30, 40, 100, 30)
        self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),self.changeValue)
        self.label = QtGui.QLabel(self)
        self.label.setPixmap(QtGui.QPixmap(r'1.png'))
        self.label.setGeometry(160, 25, 64, 64)

    def changeValue(self):
        pos = self.slider.value()
        if pos == 0:
            self.label.setPixmap(QtGui.QPixmap(r'1.png'))
        elif pos <= 30:
            self.label.setPixmap(QtGui.QPixmap(r'2.png'))
        elif pos < 80:
            self.label.setPixmap(QtGui.QPixmap(r'3.png'))
        else:
            self.label.setPixmap(QtGui.QPixmap(r'4.png'))
        #self.label.repaint()
        time.sleep(2)
        self.label.setPixmap(QtGui.QPixmap(r'agent_cash.png'))

app = QtGui.QApplication(sys.argv)
sl = SliderLabel()
sl.show()
sys.exit(app.exec_())

    从图片1.png转换到agent_cash.png之间时,有个time.sleep(2)。此时如果在time.sleep()之前没有repaint(),第一个图片1.png是没显示出来的(或者显示时间太短暂导致看不到),第二个图片agent_cash.png无论有无sleep(2)都会显示。这个跟你说的一样。
     我估计是时间休眠函数导致的问题,系统往下执行时,到了时间休眠处。但系统刷新界面讲究效率,它要等全部语句执行完再发送刷新界面的事件要求,系统根据全部更改要求,计算要更改的地方,再统一刷新界面。所以没显示第一个图片1.png,而只看见第二个图片agent_cash.png显示。但如果加了repaint(),则会在sleep之前就发送系统更新界面要求,所以能看到第一个图片1.png。
      不知道是否对。


4条评分好评度+1贡献值+1金钱+1威望+1
lason123 好评度 +1 多谢回答 2017-07-13
lason123 贡献值 +1 多谢回答 2017-07-13
lason123 威望 +1 多谢回答 2017-07-13
lason123 金钱 +1 多谢回答 2017-07-13
离线lason123

只看该作者 2楼 发表于: 2017-07-13
谢谢楼上解答还有一个问题能否帮忙再看下,可能涉及多线程,我用pyqt4做了个界面,一个button,两个label(label和label1),程序目的:点击button按钮,label和label1上同时并依次显示,黄灯,灰灯,红灯,绿灯,想法是一个按钮的单击事件,连接了两个槽,
QtCore.QObject.connect(self.pushButton2, QtCore.SIGNAL(_fromUtf8("clicked()")),self.changePic)
QtCore.QObject.connect(self.pushButton2, QtCore.SIGNAL(_fromUtf8("clicked()")),self.changePic2)
但是运行的结果是,第一个label的图片先依次显示黄灯,灰灯,红灯,绿灯,接着再试第二个label1显示黄灯,灰灯,红灯,绿灯,
两个label同时开始显示同样的图片,是不是需要进行多线程编写,应该怎么写,谢谢


完整代码如下:
from PyQt4.QtGui import QApplication, QLabel, QMovie, QPainter, QFontMetrics,QPixmap

import time


from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def __init__(self):
        self.m=QPixmap("I:/python/icon/shuijing/039/yellow.png")
        self.x=QPixmap("I:/python/icon/shuijing/039/yellow.png")
                
    def setupUi(self, Dialog):
        
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(654, 535)
        self.label = QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(80, 50, 200, 200))
        self.label.setObjectName(_fromUtf8("label"))
        self.label1 = QLabel(Dialog)
        self.label1.setGeometry(QtCore.QRect(280, 50, 200, 200))
        self.label1.setObjectName(_fromUtf8("label1"))
        self.pushButton2 = QtGui.QPushButton(Dialog)
        self.pushButton2.setGeometry(QtCore.QRect(170, 400, 191, 61))
        self.pushButton2.setText('start')
        self.pushButton2.setObjectName(_fromUtf8("pushButton2"))
        #QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")),self.stop1)
        QtCore.QObject.connect(self.pushButton2, QtCore.SIGNAL(_fromUtf8("clicked()")),self.changePic)
        QtCore.QObject.connect(self.pushButton2, QtCore.SIGNAL(_fromUtf8("clicked()")),self.changePic2)

        #self.label.setMovie(self.m)
        self.label.setScaledContents(True)
        self.label.setPixmap(self.m)
        self.label1.setScaledContents(True)
        self.label1.setPixmap(self.x)
        
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def changePic(self):
        self.b=QPixmap("I:/python/icon/shuijing/039/grey.png")
        self.label.setScaledContents(True)
        self.label.setPixmap(self.b)
        self.label.repaint()
        time.sleep(2)
        self.n=QPixmap("I:/python/icon/shuijing/039/red.png")
        self.label.setScaledContents(True)
        self.label.setPixmap(self.n)
        self.label.repaint()
        time.sleep(2)
        self.h=QPixmap("I:/python/icon/shuijing/039/green.png")
        self.label.setScaledContents(True)
        self.label.setPixmap(self.h)

        #self.label.repaint()"""        
        
    def changePic2(self):
        self.y=QPixmap("I:/python/icon/shuijing/039/grey.png")
        self.label1.setScaledContents(True)
        self.label1.setPixmap(self.y)
        self.label1.repaint()
        time.sleep(2)
        self.p=QPixmap("I:/python/icon/shuijing/039/red.png")
        self.label1.setScaledContents(True)
        self.label1.setPixmap(self.p)
        self.label1.repaint()
        time.sleep(2)
        self.k=QPixmap("I:/python/icon/shuijing/039/green.png")
        self.label1.setScaledContents(True)
        self.label1.setPixmap(self.k)
        #self.label1.repaint()  
                    
    
    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        #self.label.setText(_translate("Dialog", "TextLabel", None))

def main():  
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
    
if __name__ == "__main__":
    import sys
    
    main()
离线linote

只看该作者 3楼 发表于: 2017-07-14
我的想法是用定时器来改变图片。
         信号与槽:self.pushButton2.clicked.connect(self.autoChangePic)
槽:
    def autoChangePic(self):
        QtCore.QTimer.singleShot(0, self.changeToYellow)  # 转换成黄灯
        QtCore.QTimer.singleShot(20000, self.changeToGrey)  # 转换成灰灯,20000代表2秒后开始触发事件self.changeToGrey()函数。
        QtCore.QTimer.singleShot(40000, self.changeToRed)  # 转换成红灯
        QtCore.QTimer.singleShot(60000, self.changeToGreen)  # 转换成绿灯
原因:
1、用sleep()会造成程序假死,用触发器点击开始按钮后可以马上返回,点击开始后也可以在转换图片完成之前退出。多线程完全不必要。
2、转换图片要单独一个函数来执行,一个函数转换两个QLabel,同时转换。
3、定时触发器按时间,按顺序转换图片。



4条评分好评度+1贡献值+1金钱+1威望+1
lason123 好评度 +1 办法简单可行 2017-07-14
lason123 贡献值 +1 办法简单可行 2017-07-14
lason123 威望 +1 办法简单可行 2017-07-14
lason123 金钱 +1 办法简单可行 2017-07-14
离线lason123

只看该作者 4楼 发表于: 2017-07-14
h多谢多谢 ,这个办法简单又可行,看来定时器在pyqt4里的应用都可以取代time.sleep()了,

还有一个问题请教
我想做个程序,一个按钮,一个label,一张黄和一张灰图片,点击按钮,就跑我的某个任务
1.当任务还在跑的过程中,Qlabel上的图片类似于告警灯那样在闪烁(用黄灯和灰灯交替显示的方式-闪烁的视觉效果),表示任务在进行中    2.当我任务完成后,label最后变成了绿灯

这种方式是不是应该算多线程了,大体上应该用什么思路怎么去实现
快速回复
限100 字节
 
上一个 下一个