2016-03-30 68 views
1

Qlabelをメッセージセンターとして使用して、アプリケーションのユーザーにメッセージを中継しようとしています。メッセージの中には、Qlabelで許可されているものより長いものがあり、テキストの終わりまで水平方向にスクロールするだけのものもあります。 Qlabelでこれをどのようにすることができますか?私はデザイナーで何かを見つけることができないようで、文字列の前部から断片を取り除くコードでは、何らかの切り詰めメソッドを試してみたいと思っていません。Qlabelのスムーズなスクロールテキスト

+0

は、あなたはそれがそれらの点灯兆候の一つのように、自動的にスクロールしますか?それとも、ユーザーがスクロールできるようにしたいのですか? –

+0

点灯している記号。絶対に。誰もがそれを動かすことができないようにしてください。 – electrometro

答えて

0

デフォルトでは、Qtには何もありません。テキストを変更するアニメーションを作成する必要があります。

QFontMetricslabel.fontMetrics())を使用すると、ラベルのテキストがQLabelより大きいかどうかを判断できます(スクロールする必要があるかどうかを知るため)。 QLabelを半分ごとに再描画してスクロールをアニメートする方法が必要です。最も簡単な方法はおそらくQTimerです。最も簡単な方法はおそらくQLabelをサブクラス化し、スクロールをシミュレートするためにそれ自身をスクロールして0.5秒ごとにテキストをリセットする必要があるかどうかをチェックすることです。

さらにスムーズに(サブ文字レベルで)スクロールするには、ペイント方法をオーバーライドし、必要に応じてテキストをペイントしてペイントします。

+0

これは私が本当に避けたいものとまったく同じように聞こえる。ありがとう、私はちょうど許容されるテキストのサイズをスマートに制限する方法を見つけようとします。 – electrometro

+0

Qlabelsはあなたが知っているワードラップを許可します。 –

+0

はい、かなり小さいスペースに大きなフォントが欲しいですが、単語の折り返しはうまくいかないと思います。 – electrometro

0

あなたがしていることは、マーキーウィジェットとしてよく知られています。ここにはQLabelを使用する非常にシンプルで錆のある実装がありますが、QWidgetでも実行できます。私はQTextDocumentを使用するsetTextメソッドをオーバーライドし、テキストを保持する親であるQLabelを親とします。テキストはQLabelのサイズよりも大きい場合QTimerがテキストを移動し、翻訳方法をトリガー:

import sys 

from PyQt5.QtCore import QEvent, QTimer, pyqtSlot 
from PyQt5.QtGui import QTextDocument, QPainter, QFontMetrics 
from PyQt5.QtWidgets import QLabel, QApplication 


class Marquee(QLabel): 

    x = 0 

    paused = False 
    document = None 
    speed = 50 
    timer = None 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.fm = QFontMetrics(self.font()) 
     self.setFixedSize(200, 20) 

    def setText(self, value): 
     self.x = 0 

     self.document = QTextDocument(self) 
     self.document.setPlainText(value) 
     # I multiplied by 1.06 because otherwise the text goes on 2 lines 
     self.document.setTextWidth(self.fm.width(value) * 1.06) 
     self.document.setUseDesignMetrics(True) 

     if self.document.textWidth() > self.width(): 
      self.timer = QTimer(self) 
      self.timer.timeout.connect(self.translate) 
      self.timer.start((1/self.speed) * 1000) 

    @pyqtSlot() 
    def translate(self): 
     if not self.paused: 
      if self.width() - self.x < self.document.textWidth(): 
       self.x -= 1 
      else: 
       self.timer.stop() 
     self.repaint() 

    def event(self, event): 
     if event.type() == QEvent.Enter: 
      self.paused = True 
     elif event.type() == QEvent.Leave: 
      self.paused = False 
     return super().event(event) 

    def paintEvent(self, event): 
     if self.document: 
      p = QPainter(self) 
      p.translate(self.x, 0) 
      self.document.drawContents(p) 
     return super().paintEvent(event) 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    w = Marquee() 
    w.setText('Lorem ipsum dolor sit amet, consectetur adipiscing elit...') 
    w.show() 
    sys.exit(app.exec_())