2017-09-30 6 views
0

PySide 레이블에 파이썬의 마키 효과를 어떻게 만들 수 있습니까? 목록에 몇 가지 뉴스 헤드 라인이 있으며 창 하단을 스크롤하도록합니다. 아래 그림과 같이PySide의 움직이는 효과 만들기

+0

내가 내 솔루션 작업을 했습니까? 그랬다면 제 대답을 옳은 것으로 표시하십시오. – eyllanesc

+0

아직 구현 중입니다. 나는 학교에서 바빠서 일할 시간이별로 없다. 곧 끝내야 해. – Sebiancoder

+0

제발 시간을내어 당신을 돕기 위해 가져갔습니다. OS의 평범한 일은 정답이 그것을 upvote로 주거나 올바른 것으로 표시하는 것입니다. 그가 봉사했는지에 대해 묻고 대답하지 않으면 커뮤니티가 그를 도울 수 없게됩니다. : P – eyllanesc

답변

1

당신은 사용자 정의 위젯을 만들 수 있지만 많은 방법을 구현하는 것은 QLabel 클래스를 활용하는 작업을 피하기 위해 :

class MarqueeLabel(QLabel): 
    def __init__(self, parent=None): 
     QLabel.__init__(self, parent) 
     self.px = 0 
     self.py = 15 
     self._direction = Qt.LeftToRight 
     self.setWordWrap(True) 
     self.timer = QTimer(self) 
     self.timer.timeout.connect(self.update) 
     self.timer.start(40) 
     self._speed = 2 
     self.textLength = 0 
     self.fontPointSize = 0 
     self.setAlignment(Qt.AlignVCenter) 
     self.setFixedHeight(self.fontMetrics().height()) 

    def setFont(self, font): 
     QLabel.setFont(self, font) 
     self.setFixedHeight(self.fontMetrics().height()) 

    def updateCoordinates(self): 
     align = self.alignment() 
     if align == Qt.AlignTop: 
      self.py = 10 
     elif align == Qt.AlignBottom: 
      self.py = self.height() - 10 
     elif align == Qt.AlignVCenter: 
      self.py = self.height()/2 
     self.fontPointSize = self.font().pointSize()/2 
     self.textLength = self.fontMetrics().width(self.text()) 

    def setAlignment(self, alignment): 
     self.updateCoordinates() 
     QLabel.setAlignment(self, alignment) 

    def resizeEvent(self, event): 
     self.updateCoordinates() 
     QLabel.resizeEvent(self, event) 

    def paintEvent(self, event): 
     painter = QPainter(self) 
     if self._direction == Qt.RightToLeft: 
      self.px -= self.speed() 
      if self.px <= -self.textLength: 
       self.px = self.width() 
     else: 
      self.px += self.speed() 
      if self.px >= self.width(): 
       self.px = -self.textLength 
     painter.drawText(self.px, self.py + self.fontPointSize, self.text()) 
     painter.translate(self.px, 0) 

    def speed(self): 
     return self._speed 

    def setSpeed(self, speed): 
     self._speed = speed 

    def setDirection(self, direction): 
     self._direction = direction 
     if self._direction == Qt.RightToLeft: 
      self.px = self.width() - self.textLength 
     else: 
      self.px = 0 
     self.update() 

    def pause(self): 
     self.timer.stop() 

    def unpause(self): 
     self.timer.start() 

다음 예

는 다음 link에서 찾을 수 있습니다.

class Example(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setWindowTitle("Marquee Effect") 
     self.setLayout(QVBoxLayout()) 
     self.marqueeLabel = MarqueeLabel(self) 
     flayout = QFormLayout() 
     self.layout().addLayout(flayout) 
     le = QLineEdit(self) 
     le.textChanged.connect(self.marqueeLabel.setText) 
     le.setText("""Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.""") 
     slider = QSlider(Qt.Horizontal, self) 
     slider.valueChanged.connect(self.marqueeLabel.setSpeed) 
     slider.setValue(10) 

     rtl = QRadioButton("Right to Left", self) 
     ltr = QRadioButton("Left to Rigth", self) 
     rtl.toggled.connect(lambda state: self.marqueeLabel.setDirection(Qt.RightToLeft if state else Qt.LeftToRight)) 
     ltr.setChecked(True) 

     directionWidget = QWidget(self) 
     directionWidget.setLayout(QHBoxLayout()) 
     directionWidget.layout().setContentsMargins(0, 0, 0, 0) 
     directionWidget.layout().addWidget(rtl) 
     directionWidget.layout().addWidget(ltr) 
     fontBtn = QPushButton("Font...", self) 
     fontBtn.clicked.connect(self.changeFont) 
     colorBtn = QPushButton("Color...", self) 
     colorBtn.clicked.connect(self.changeColor) 
     pauseBtn = QPushButton("Pause", self) 
     pauseBtn.setCheckable(True) 
     pauseBtn.toggled.connect(lambda state: self.marqueeLabel.pause() if state else self.marqueeLabel.unpause()) 
     pauseBtn.toggled.connect(lambda state: pauseBtn.setText("Resume") if state else pauseBtn.setText("Pause")) 

     flayout.addRow("Change Text", le) 
     flayout.addRow("Change Speed", slider) 
     flayout.addRow("Direction", directionWidget) 
     flayout.addRow("fontBtn", fontBtn) 
     flayout.addRow("colorBtn", colorBtn) 
     flayout.addRow("Animation", pauseBtn) 
     self.layout().addWidget(self.marqueeLabel) 

    def changeColor(self): 
     palette = self.marqueeLabel.palette() 
     color = QColorDialog.getColor(palette.brush(QPalette.WindowText).color(), self) 
     if color.isValid(): 
      palette.setBrush(QPalette.WindowText, color) 
      self.marqueeLabel.setPalette(palette) 

    def changeFont(self): 
     font, ok = QFontDialog.getFont(self.marqueeLabel.font(), self) 
     if ok: 
      self.marqueeLabel.setFont(font) 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    w = Example() 
    w.show() 
    sys.exit(app.exec_()) 

출력 :

enter image description here

+0

QLineEdit 함수를 사용하지 않고 텍스트를 어떻게 설정합니까? – Sebiancoder

+0

예제를 사용하고 싶지 않다고 가정합니다. 예를 들어'QLineEdit'가 다음 줄을 주석 처리하지 않게하려는 경우, 내가 만든 위젯에도'setText()'메서드가 있습니다 :'le.textChanged.connect (self.marqueLabel.setText)'를 호출 한 다음,'self.marqueeLabel.setText ("your_text")' – eyllanesc