baseheader.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "baseheader.h"
  2. #include "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 colorBG = QColor(255, 255, 255);
  45. QColor colorBorder = QColor(255, 255, 255, 38);
  46. // QColor colorText = QColor(210, 210, 210);
  47. QColor colorText = QColor("#3A3F63");
  48. //背景
  49. PainterEx *painterEx = static_cast<PainterEx*>(painter);
  50. painterEx->SetBrushOnly(colorBG);
  51. painterEx->drawRect(rect);
  52. //顶部横线
  53. painterEx->DrawBorder(rect, colorBorder, PainterEx::RectBorderTop);
  54. //文本
  55. FontEx font(qApp->font().family(), 14, false);
  56. QFontMetrics fontMetrics(font);
  57. QString headerText = model()->headerData(logicalIndex, orientation()).toString();
  58. QString text = fontMetrics.elidedText(headerText, Qt::ElideRight, rect.width()-16);
  59. painterEx->setFont(font);
  60. bool isCheckableCol = (m_bCheckable && logicalIndex == 0);
  61. QRect textRect = rect.adjusted((isCheckableCol?44:0),0,0,0);
  62. if(!isCheckableCol && logicalIndex == 0)
  63. {
  64. textRect = rect.adjusted(12,0,0,0);
  65. }
  66. painterEx->DrawText(textRect, text, colorText, m_alignmentText);
  67. //底部横线
  68. painterEx->DrawBorder(rect, colorBorder, PainterEx::RectBorderBottom);
  69. //排序图标
  70. if(m_bSortable && !m_listSortDisable.contains(logicalIndex))
  71. {
  72. QColor upColor = (m_nCurSortedIndex == logicalIndex && m_stateCurSorted == Asc)?QColor(133,142,189,200):QColor(133,142,189,80);
  73. QColor downColor = (m_nCurSortedIndex == logicalIndex && m_stateCurSorted == Desc)?QColor(133,142,189,200):QColor(133,142,189,80);
  74. QSize textSize = fontMetrics.size(Qt::TextSingleLine, text);
  75. int xPos = textRect.left() + textSize.width() + 6;
  76. int yPos = rect.top() + (rect.height() - fontMetrics.capHeight())/2 + 1;
  77. painterEx->DrawTriangle(QRect(xPos, yPos, 10, 5), true, upColor);
  78. painterEx->DrawTriangle(QRect(xPos, yPos+7, 10, 5), false, downColor);
  79. }
  80. //checkbox图标
  81. if(m_bCheckable && logicalIndex == 0)
  82. {
  83. painterEx->save();
  84. QRect target(rect.left()+12, rect.top()+(rect.height()-16)/2, 20, 20);
  85. painterEx->DrawPixmap(target, GetCheckboxImage(m_checkState));
  86. painterEx->restore();
  87. }
  88. }
  89. void BaseHeader::OnSectionClicked(int logicalIndex)
  90. {
  91. if(m_bSortable && !m_listSortDisable.contains(logicalIndex))
  92. {
  93. if(m_nCurSortedIndex == logicalIndex)
  94. {
  95. int state = m_stateCurSorted;
  96. state = (state + 1)%3;
  97. m_stateCurSorted = SortState(state);
  98. emit sig_Sorted(logicalIndex, m_stateCurSorted);
  99. }
  100. else
  101. {
  102. m_nCurSortedIndex = logicalIndex;
  103. m_stateCurSorted = Asc;
  104. emit sig_Sorted(logicalIndex, Asc);
  105. }
  106. }
  107. if(m_bCheckable && logicalIndex == 0)
  108. {
  109. m_checkState = (m_checkState != Qt::Checked)?(Qt::Checked):(Qt::Unchecked);
  110. emit sig_Checked(m_checkState == Qt::Checked);
  111. }
  112. updateSection(logicalIndex);
  113. }
  114. QString BaseHeader::GetCheckboxImage(Qt::CheckState state) const
  115. {
  116. if(state == Qt::Unchecked)
  117. {
  118. return ":/icon/unchecked.png";
  119. }
  120. else if(state == Qt::PartiallyChecked)
  121. {
  122. return ":/icon/partially_checked.png";
  123. }
  124. else if(state == Qt::Checked)
  125. {
  126. return ":/icon/checked.png";
  127. }
  128. return "";
  129. }