2010-06-11 6 views
1

PyQt를 사용하여 고정 위치에 QLabel (부모 없음)을 표시하려고합니다. 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]" 

답변

1

pos 속성을 사용하거나 move()를 호출하여 레이블을 이동할 수 있습니다. 그러나 항상 잘 작동하는 것은 아닙니다. 내 경험에서 가장 좋은 방법은 label.setGeometry() 함수를 사용하는 것이다. 당신이 코드는 다음과 같이해야 화면의 중앙에 원하는 경우

는 (미안 파이썬을 잘 모릅니다, C++ 코드) : 이렇게하면 부모의 resizeEvent에

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

당신 항상 그 중심에 놓이게 될 것입니다.

sizeHint를 변수에 저장하면 코드를 최적화하여 여러 번 호출하지 않아도됩니다.

+0

form.show() 직전에 형상 : form.setGeometry (10,10,200,50)을 설정했지만 작동하지 않으면 라벨이 화면 중간에 다시 나타납니다. 어쩌면 문제는 최상위 위젯이 레이블이고 부모가 없다는 것입니다. 하지만 어떻게 해결해야할지 모르겠다. – alfredozn

+0

나는 본다. 문제는 그것입니다. 최상위 위젯이 없다는 것은 Qt가 양식의 최상위 레벨이 될 창을 자동으로 작성한다는 의미입니다. 해결 방법은 투명한 QDialog를 최상위 창으로 사용하는 것입니다. 대화 상자를 표시하면 화면의 원하는 위치로 이동할 수 있습니다. QDesktopServices를 사용하여 화면 분석을 알 수 있습니다. 희망이 당신의 문제에 도움이됩니다. – cnebrera

+0

고맙습니다. 귀하의 제안을 따르고 __main__에서 Qdialog를 생성하고이를 사용자 정의 QLabel에 추가 할 때 작동했습니다. 그런 다음 Qdialog에 대한 사용자 정의 위젯의 유형을 바꾸려고 시도했지만 문제는 다시 발생합니다. 그래서이 문제를 보니 문제가이 줄에 있다는 것을 알았습니다 : super (BrightnessControl, self) .__ init __ (parent, Qt.SplashScreen) 부모가 없기 때문에 아무 것도 .... 그래서 나는 바꿨고 이제는 내 위젯을 옮길 수 있습니다. 비록 그것이 Qlabel 일지라도. – alfredozn

0

pos 속성을 사용 : 이것은 내 코드는

, 어쩌면 내가이 일을 해요 방식에 문제가 있습니다.

+0

이미 move() 함수로 시도했지만 나에게 적합하지 않습니다. 또한 pos 속성에 대한 QPoint를 직접 설정하려고 시도했습니다. pos = QPoint (100,100) 컴파일하고 실행하지만 pos가 setter를 가지고 있지 않기 때문에 올바른지 모르겠습니다 ... – alfredozn