Qlabelをメッセージセンターとして使用して、アプリケーションのユーザーにメッセージを中継しようとしています。メッセージの中には、Qlabelで許可されているものより長いものがあり、テキストの終わりまで水平方向にスクロールするだけのものもあります。 Qlabelでこれをどのようにすることができますか?私はデザイナーで何かを見つけることができないようで、文字列の前部から断片を取り除くコードでは、何らかの切り詰めメソッドを試してみたいと思っていません。Qlabelのスムーズなスクロールテキスト
答えて
デフォルトでは、Qtには何もありません。テキストを変更するアニメーションを作成する必要があります。
QFontMetrics
(label.fontMetrics()
)を使用すると、ラベルのテキストがQLabel
より大きいかどうかを判断できます(スクロールする必要があるかどうかを知るため)。 QLabel
を半分ごとに再描画してスクロールをアニメートする方法が必要です。最も簡単な方法はおそらくQTimer
です。最も簡単な方法はおそらくQLabel
をサブクラス化し、スクロールをシミュレートするためにそれ自身をスクロールして0.5秒ごとにテキストをリセットする必要があるかどうかをチェックすることです。
さらにスムーズに(サブ文字レベルで)スクロールするには、ペイント方法をオーバーライドし、必要に応じてテキストをペイントしてペイントします。
これは私が本当に避けたいものとまったく同じように聞こえる。ありがとう、私はちょうど許容されるテキストのサイズをスマートに制限する方法を見つけようとします。 – electrometro
Qlabelsはあなたが知っているワードラップを許可します。 –
はい、かなり小さいスペースに大きなフォントが欲しいですが、単語の折り返しはうまくいかないと思います。 – electrometro
あなたがしていることは、マーキーウィジェットとしてよく知られています。ここには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_())
- 1. アニメーション/スクロールテキスト
- 2. 横スクロールテキスト?
- 3. JavaScriptスクロールテキスト
- 4. asp.net内のスクロールテキスト
- 5. HTMLのスクロールテキストCSS
- 6. PyQtのスクロールテキスト?
- 7. xamarin C#スクロールテキストのUIViewController
- 8. スクロールテキスト表示
- 9. iOS5のYahoo Financeウィジェットのようなスクロールテキスト
- 10. QLabel
- 11. 特定の幅のスクロールテキスト
- 12. WPFのスクロールテキストをマスクする
- 13. WP7テキストボックスの自動スクロールテキスト
- 14. Transpaprent QLabel
- 15. QLabelワードラップモード
- 16. qlabelのセンタリング
- 17. ヘッダーのスムーズなアニメーション
- 18. ラインのスムーズなアルゴリズム
- 19. スムーズなプロット
- 20. XNA、スムーズなジャンプアニメーション
- 21. スムーズなSVGアニメーション
- 22. スムーズなPostScriptアニメーション
- 23. スムーズな動き
- 24. 新しいQLabelと新しくないQLabelの違いは何ですか?
- 25. CSSスクロールテキスト初期スクロール位置
- 26. スクロールテキストを作成する
- 27. QLabelのQRubberBandとMPlayer
- 28. QLabelを使用しないQTreeViewのハイパーリンク
- 29. 動的テキストサイズQLabel
- 30. Python PyQt Qlabel Resize
は、あなたはそれがそれらの点灯兆候の一つのように、自動的にスクロールしますか?それとも、ユーザーがスクロールできるようにしたいのですか? –
点灯している記号。絶対に。誰もがそれを動かすことができないようにしてください。 – electrometro