TextWidget.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "TextWidget.h"
  2. #include <QPainter>
  3. #include <QTimer>
  4. #include <QDebug>
  5. #include <QtGlobal>
  6. using namespace Qt;
  7. class TextWidgetPrivate
  8. {
  9. Q_DISABLE_COPY(TextWidgetPrivate)
  10. public:
  11. explicit TextWidgetPrivate(TextWidget* parent);
  12. ~TextWidgetPrivate();
  13. QString m_Text;
  14. int m_Flags;
  15. QFont m_Font;
  16. TextWidget::Type m_LanguageType;
  17. bool m_Animation;
  18. int m_TextWidth;
  19. int m_XPos;
  20. QTimer* m_Timer;
  21. TextElideMode m_TextElideMode;
  22. QList<TextWidget::CustomString> m_List;
  23. private:
  24. TextWidget* m_Parent;
  25. };
  26. TextWidget::TextWidget(QWidget *parent)
  27. : QWidget(parent)
  28. , m_Private(new TextWidgetPrivate(this))
  29. {
  30. }
  31. TextWidget::~TextWidget()
  32. {
  33. }
  34. void TextWidget::setCustomText(const QList<TextWidget::CustomString> &text)
  35. {
  36. m_Private->m_List = text;
  37. if (isVisible()) {
  38. update();
  39. }
  40. }
  41. void TextWidget::setText(const QString &text)
  42. {
  43. if (m_Private->m_Text != text) {
  44. m_Private->m_Text = text;
  45. m_Private->m_TextWidth = fontMetrics().horizontalAdvance(m_Private->m_Text);
  46. if (NULL != m_Private->m_Timer) {
  47. if (m_Private->m_TextWidth > width()) {
  48. m_Private->m_Timer->setSingleShot(false);
  49. m_Private->m_Timer->start(33);
  50. m_Private->m_XPos = 0;
  51. } else {
  52. m_Private->m_Timer->stop();
  53. m_Private->m_XPos = 0;
  54. }
  55. }
  56. if (isVisible()) {
  57. update();
  58. }
  59. }
  60. }
  61. void TextWidget::setLanguageType(const TextWidget::Type type)
  62. {
  63. m_Private->m_LanguageType = type;
  64. if (isVisible()) {
  65. update();
  66. }
  67. }
  68. void TextWidget::setAlignmentFlag(const int flags)
  69. {
  70. m_Private->m_Flags = flags;
  71. if (isVisible()) {
  72. update();
  73. }
  74. }
  75. void TextWidget::setFontPointSize(const int pointSize)
  76. {
  77. m_Private->m_Font.setPointSize(pointSize);
  78. setFont(m_Private->m_Font);
  79. if (isVisible()) {
  80. update();
  81. }
  82. }
  83. void TextWidget::setAnimation(const bool flag)
  84. {
  85. m_Private->m_Animation = flag;
  86. if (NULL == m_Private->m_Timer) {
  87. m_Private->m_Timer = new QTimer(this);
  88. Qt::ConnectionType type = static_cast<Qt::ConnectionType>(Qt::AutoConnection | Qt::UniqueConnection);
  89. QObject::connect(m_Private->m_Timer, SIGNAL(timeout()),
  90. this, SLOT(onTimeout()),
  91. type);
  92. }
  93. }
  94. void TextWidget::setTextElideMode(const Qt::TextElideMode mode)
  95. {
  96. m_Private->m_TextElideMode = mode;
  97. if (isVisible()) {
  98. update();
  99. }
  100. }
  101. void TextWidget::paintEvent(QPaintEvent *event)
  102. {
  103. if (!m_Private->m_Text.isEmpty()
  104. || (0 != m_Private->m_List.size())) {
  105. QPainter painter(this);
  106. painter.setPen(QPen(Qt::white));
  107. if (TextWidget::T_Translate == m_Private->m_LanguageType) {
  108. if (0 == m_Private->m_List.size()) {
  109. painter.drawText(rect(), m_Private->m_Flags, QObject::tr(m_Private->m_Text.toLocal8Bit().constData()));
  110. } else {
  111. QString text;
  112. for (int i = 0; i < m_Private->m_List.size(); ++i) {
  113. if (m_Private->m_List.at(i).translate) {
  114. text += QObject::tr(m_Private->m_List.at(i).string.toLocal8Bit().constData());
  115. } else {
  116. text += m_Private->m_List.at(i).string;
  117. }
  118. }
  119. painter.drawText(rect(), m_Private->m_Flags, text);
  120. }
  121. } else {
  122. if (NULL != m_Private->m_Timer) {
  123. if (m_Private->m_TextWidth > width()) {
  124. painter.drawText(QRect(m_Private->m_XPos, 0, m_Private->m_TextWidth, height()), m_Private->m_Text);
  125. } else {
  126. painter.drawText(rect(), m_Private->m_Flags, m_Private->m_Text);
  127. }
  128. } else {
  129. QFontMetrics fontMetrics(painter.font());
  130. QString text = fontMetrics.elidedText(m_Private->m_Text, m_Private->m_TextElideMode, width());
  131. painter.drawText(rect(), m_Private->m_Flags, text);
  132. }
  133. }
  134. }
  135. QWidget::paintEvent(event);
  136. }
  137. void TextWidget::onTimeout()
  138. {
  139. --m_Private->m_XPos;
  140. if (abs(m_Private->m_XPos) > m_Private->m_TextWidth) {
  141. m_Private->m_XPos = width();
  142. }
  143. if (isVisible()) {
  144. update();
  145. }
  146. }
  147. TextWidgetPrivate::TextWidgetPrivate(TextWidget* parent)
  148. : m_Parent(parent)
  149. {
  150. m_Flags = Qt::AlignCenter;
  151. m_LanguageType = TextWidget::T_Translate;
  152. m_Animation = false;
  153. m_TextWidth = 0;
  154. m_XPos = 0;
  155. m_Timer = NULL;
  156. m_TextElideMode = ElideRight;
  157. m_List.clear();
  158. m_Parent->setFont(m_Font);
  159. }
  160. TextWidgetPrivate::~TextWidgetPrivate()
  161. {
  162. }