baseheader.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "baseheader.h"
  2. #include <Common/External/Core/PaintHelper/painthelper.h>
  3. #include <QDebug>
  4. #include <QApplication>
  5. BaseHeader::BaseHeader(QWidget *parent, Qt::Orientation orientation, Qt::Alignment flags)
  6. : QHeaderView(orientation, parent)
  7. , m_alignmentText(flags)
  8. , m_nCurSortedIndex(-1)
  9. , m_bSortable(false)
  10. , m_stateCurSorted(Disable)
  11. , m_bCheckable(false)
  12. , m_checkState(Qt::Unchecked)
  13. {
  14. connect(this, &QHeaderView::sectionClicked, this, &BaseHeader::OnSectionClicked);
  15. }
  16. void BaseHeader::SetTextAlignment(Qt::Alignment flags)
  17. {
  18. m_alignmentText = flags;
  19. }
  20. void BaseHeader::SetSortable(bool value, const QList<int> &notSortList)
  21. {
  22. m_bSortable = value;
  23. setSectionsClickable(value);
  24. m_listSortDisable = notSortList;
  25. }
  26. void BaseHeader::SetCheckable(bool value)
  27. {
  28. m_bCheckable = value;
  29. setSectionsClickable(value);
  30. }
  31. void BaseHeader::SetChecked(Qt::CheckState state)
  32. {
  33. m_checkState = state;
  34. updateSection(0);
  35. }
  36. QString BaseHeader::GetText(int logicalIndex)
  37. {
  38. return model()->headerData(logicalIndex, orientation()).toString();
  39. }
  40. void BaseHeader::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
  41. {
  42. //颜色
  43. QColor colorBG = QColor(70, 70, 73);
  44. QColor colorBorder = QColor(255, 255, 255, 38);
  45. QColor colorText = QColor(210, 210, 210);
  46. //背景
  47. PainterEx *painterEx = static_cast<PainterEx*>(painter);
  48. painterEx->SetBrushOnly(colorBG);
  49. painterEx->drawRect(rect);
  50. //顶部横线
  51. painterEx->DrawBorder(rect, colorBorder, PainterEx::RectBorderTop);
  52. //文本
  53. FontEx font(qApp->font().family(), 14, false);
  54. QFontMetrics fontMetrics(font);
  55. QString headerText = model()->headerData(logicalIndex, orientation()).toString();
  56. QString text = fontMetrics.elidedText(headerText, Qt::ElideRight, rect.width()-16);
  57. painterEx->setFont(font);
  58. bool isCheckableCol = (m_bCheckable && logicalIndex == 0);
  59. QRect textRect = rect.adjusted((isCheckableCol?44:0),0,0,0);
  60. if(!isCheckableCol && logicalIndex == 0)
  61. {
  62. textRect = rect.adjusted(12,0,0,0);
  63. }
  64. painterEx->DrawText(textRect, text, colorText, m_alignmentText);
  65. //底部横线
  66. painterEx->DrawBorder(rect, colorBorder, PainterEx::RectBorderBottom);
  67. //排序图标
  68. if(m_bSortable && !m_listSortDisable.contains(logicalIndex))
  69. {
  70. QColor upColor = (m_nCurSortedIndex == logicalIndex && m_stateCurSorted == Asc)?QColor(133,142,189,200):QColor(133,142,189,80);
  71. QColor downColor = (m_nCurSortedIndex == logicalIndex && m_stateCurSorted == Desc)?QColor(133,142,189,200):QColor(133,142,189,80);
  72. QSize textSize = fontMetrics.size(Qt::TextSingleLine, text);
  73. int xPos = textRect.left() + textSize.width() + 6;
  74. int yPos = rect.top() + (rect.height() - fontMetrics.capHeight())/2 + 1;
  75. painterEx->DrawTriangle(QRect(xPos, yPos, 10, 5), true, upColor);
  76. painterEx->DrawTriangle(QRect(xPos, yPos+7, 10, 5), false, downColor);
  77. }
  78. //checkbox图标
  79. if(m_bCheckable && logicalIndex == 0)
  80. {
  81. painterEx->save();
  82. QRect target(rect.left()+12, rect.top()+(rect.height()-16)/2, 16, 16);
  83. painterEx->DrawPixmap(target, GetCheckboxImage(m_checkState));
  84. painterEx->restore();
  85. }
  86. }
  87. void BaseHeader::OnSectionClicked(int logicalIndex)
  88. {
  89. if(m_bSortable && !m_listSortDisable.contains(logicalIndex))
  90. {
  91. if(m_nCurSortedIndex == logicalIndex)
  92. {
  93. int state = m_stateCurSorted;
  94. state = (state + 1)%3;
  95. m_stateCurSorted = SortState(state);
  96. emit sig_Sorted(logicalIndex, m_stateCurSorted);
  97. }
  98. else
  99. {
  100. m_nCurSortedIndex = logicalIndex;
  101. m_stateCurSorted = Asc;
  102. emit sig_Sorted(logicalIndex, Asc);
  103. }
  104. }
  105. if(m_bCheckable && logicalIndex == 0)
  106. {
  107. m_checkState = (m_checkState != Qt::Checked)?(Qt::Checked):(Qt::Unchecked);
  108. emit sig_Checked(m_checkState == Qt::Checked);
  109. }
  110. updateSection(logicalIndex);
  111. }
  112. QString BaseHeader::GetCheckboxImage(Qt::CheckState state) const
  113. {
  114. if(state == Qt::Unchecked)
  115. {
  116. return ":/checkbox_unchecked.png";
  117. }
  118. else if(state == Qt::PartiallyChecked)
  119. {
  120. return ":/checkbox_partcheked.png";
  121. }
  122. else if(state == Qt::Checked)
  123. {
  124. return ":/checkbox_checked.png";
  125. }
  126. return "";
  127. }