设置QLabel的全球位置

时间:2010-06-11 16:33:30

标签: user-interface qt pyqt

我正在尝试使用PyQt在固定位置显示QLabel(没有父级)。 QLabel作为一个只出现片刻的图形,默认情况下显示在屏幕中间,但我找不到如何移动它的位置。

有什么建议吗?

更新

这是我的代码,可能是我这样做的问题:

from PyQt4.QtCore import Qt,QTimer
from PyQt4.QtGui import QLabel,QPixmap,QApplication

import os
import subprocess

class BrightnessControl(QLabel):


    def __init__(self,parent=None):

        self.__command__ = "nvclock -S%s"
        self.__imgPath__ = "../../../../ui/alfredozn_vaio/brightness/img/"
        self.__image__ = QPixmap()

        super(BrightnessControl,self).__init__(parent,Qt.SplashScreen)
        #self.loadImg(100)


    def comman(self):
        return self.__command__

    def image(self):
        return self.__image__

    def imgPath(self):
        return self.__imgPath__

    def currentValue(self):
        '''
        Obtenemos el valor actual del smartdimmer
        '''
        res=subprocess.Popen(["smartdimmer","-g"],stdout=subprocess.PIPE)
        return int(res.stdout.readline().split()[-1])

    def loadImg(self,value):
        '''
        Aquí asumimos que el único medio de control será la aplicación, por lo que los valores se moverán en múltiplos de 10 
        '''
        os.system(self.comman() % str(value))
        self.image().load("%s%i.png" % (self.imgPath(),value))
        self.setPixmap(self.image())
        self.setMask(self.image().mask())
        self.update()


if __name__ == "__main__":

    import sys

    app = QApplication(sys.argv)
    try:
        if len(sys.argv) < 2 :
            raise ValueError 
        else:
            val=10
            if sys.argv[1] == "down":
                val*=-1
            elif sys.argv[1] != "up":
                raise ValueError

            form = BrightnessControl()
            val += form.currentValue()
            val = 20 if val < 20 else 100 if val > 100 else val 
            form.loadImg(val)

            #This move function is not working
            form.move(100,100)

            form.show()
            QTimer.singleShot(3000,app.quit)
            app.exec_()
    except ValueError:
        print "Modo de uso: SonyBrightnessControl [up|down]"

2 个答案:

答案 0 :(得分:1)

您可以使用pos属性,也可以将move()移动到标签中。但它并不总是运作良好。根据我的经验,最好的方法是使用label.setGeometry()函数。

如果你想在屏幕中间显示代码应该是这样的(是c ++代码,我不知道python抱歉):

label.setGeometry((this->width() - label.sizeHint().width()) / 2), (this->height() - label.sizeHint().height()) / 2, label.sizeHint().width(), label.sizeHint().height());

如果你在父母的resizeEvent中这样做,你将总是在它的中心。

您还可以优化代码,将sizeHint保存到变量中,不要多次调用它。

答案 1 :(得分:0)

使用其pos属性。