2017-10-24 2 views
1

QLabel을 상속하는 사용자 정의 위젯을 만들고 있는데, 위젯에 사용자에게 표시 할 때 데이터 서식을 지정하는 속성을 갖고 싶습니다.PyQt에서 Q_ENUMS를 사용하는 방법

나는 Q_ENUMS을 사용하려고하는데,별로 성공하지 못했습니다. Designer에서 속성을 표시 할 수 있지만 저장된 UI 파일은 PyDMLabel::STRING이라는 열거 형을 나타내지 만 DisplayFormat::STRING을 기대하지는 않습니다.

class PyDMLabel(QLabel, PyDMWidget): 
    class DisplayFormat: 
     DEFAULT = 0 
     STRING = 1 
     DECIMAL = 2 
     EXPONENTIAL = 3 
     HEX = 4 
     BINARY = 5 

    Q_ENUMS(DisplayFormat) 

    """ 
    A QLabel with support for Channels and more from PyDM 

    Parameters 
    ---------- 
    parent : QWidget 
     The parent widget for the Label 
    init_channel : str, optional 
     The channel to be used by the widget. 
    """ 
    def __init__(self, parent=None, init_channel=None): 
     QLabel.__init__(self, parent) 
     PyDMWidget.__init__(self, init_channel=init_channel) 

     self.setTextFormat(Qt.PlainText) 
     self.setTextInteractionFlags(Qt.NoTextInteraction) 
     self.setText("PyDMLabel") 
     self._display_format_type = PyDMLabel.DisplayFormat.DEFAULT 

    @pyqtProperty(DisplayFormat) 
    def displayFormat(self): 
     return self._display_format_type 

    @displayFormat.setter 
    def displayFormat(self, new_type): 
     if self._display_format_type != new_type: 
      self._display_format_type = new_type 

Q_ENUMS와 PyQt는에 대처하는 올바른 방법은 무엇입니까 : 여기

위젯 내 코드?

답변

0

Qt (디자이너)가 열거 형을 보게하려면 PyQt가 그것을 사용자 지정 클래스의 meta-object에 추가해야합니다. 따라서 Qt는 절대로 DisplayFormat::STRING이라고 말할 수 없습니다.

Qt에서 클래스 범위에 선언 된 enum은 해당 상수를 클래스 멤버로 노출합니다. 예를 들어 QComboBox 클래스는 InsertPolicy 열거 형을 정의하며 상수는 QComboBox::InsertAtTop과 같이 참조 할 수 있습니다. 이 점에서 ui 파일에 PyDMLabel::STRING이 표시되므로 Qt Designer 플러그인에서 PyQt Q_ENUMS의 동작이 예상 한 것과 동일합니다.

그러나 파이썬 코드에서 완전히 동등한 동작을하려면 약간의 추가 작업이 필요합니다. 내가 가지고 올 수있는 가장 가까운이 있습니다 :

class DisplayFormat: 
    DEFAULT = 0 
    STRING = 1 
    DECIMAL = 2 
    EXPONENTIAL = 3 
    HEX = 4 
    BINARY = 5 

class PyDMLabel(QLabel, PyDMWidget, DisplayFormat): 
    DisplayFormat = DisplayFormat 

    Q_ENUMS(DisplayFormat) 

이 것 여전히 PyDMLabel::STRING를 사용하여 Qt는 디자이너에서 결과 (예상대로). 이러한 옵션 중 두 번째를 잃는 괜찮다면

PyDMLabel.STRING 
PyDMLabel.DisplayFormat.STRING 
DisplayFormat.STRING 

그리고 사실

는,이에 더욱 일을 단순화 수 :

그러나 파이썬 코드는 이제 이러한 방법으로 상수에 액세스 할 수 있습니다
class DisplayFormat: 
    DEFAULT = 0 
    ...  

class PyDMLabel(QLabel, PyDMWidget, DisplayFormat):  
    Q_ENUMS(DisplayFormat) 
+0

고맙습니다! 당신의 제안으로 나는 그것을 작동시킬 수있었습니다. 동일한 개념을 사용하여 동적 열거 형을 만들 수 있는지 알고 계십니까? – hhslepicka

+0

@hhslepicka. 나는 정확히 모르겠다. 필자는 PyQt가'Q_ENUMS'을 작동시키기위한 메타 클래스 해킹을한다고 생각합니다. 그래서 클래스 범위에서 정의해야합니다. 그러나 나는 그 주위에 어떤 방법이 있는지 모르겠습니다. – ekhumoro

+0

다시 한번 감사드립니다. 나는 일반적인 열거 형에 대해서도 Qt와 같은 줄에서 무언가를 만드는 법을 또한 조사하려고 노력할 것이고 만약 내가 뭔가를 발견한다면 나는 여기에 다시 올 것이다. – hhslepicka

관련 문제