PySide
레이블에 파이썬의 마키 효과를 어떻게 만들 수 있습니까? 목록에 몇 가지 뉴스 헤드 라인이 있으며 창 하단을 스크롤하도록합니다. 아래 그림과 같이PySide의 움직이는 효과 만들기
0
A
답변
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_())
출력 :
+0
QLineEdit 함수를 사용하지 않고 텍스트를 어떻게 설정합니까? – Sebiancoder
+0
예제를 사용하고 싶지 않다고 가정합니다. 예를 들어'QLineEdit'가 다음 줄을 주석 처리하지 않게하려는 경우, 내가 만든 위젯에도'setText()'메서드가 있습니다 :'le.textChanged.connect (self.marqueLabel.setText)'를 호출 한 다음,'self.marqueeLabel.setText ("your_text")' – eyllanesc
내가 내 솔루션 작업을 했습니까? 그랬다면 제 대답을 옳은 것으로 표시하십시오. – eyllanesc
아직 구현 중입니다. 나는 학교에서 바빠서 일할 시간이별로 없다. 곧 끝내야 해. – Sebiancoder
제발 시간을내어 당신을 돕기 위해 가져갔습니다. OS의 평범한 일은 정답이 그것을 upvote로 주거나 올바른 것으로 표시하는 것입니다. 그가 봉사했는지에 대해 묻고 대답하지 않으면 커뮤니티가 그를 도울 수 없게됩니다. : P – eyllanesc