QTableWidget自定義表頭QHeaderView加全選復選框


1         QTableWidget自定義表頭QHeaderView加全選復選框

在使用QTableWidget時需要在表頭添加全選復選框,但是默認的表頭無法添加復選框,只能用圖片畫上去一個復選框了。並且實現點擊復選框時,發出信號,讓QTableWidget中每條記錄的復選框都選中,取消時,QTableWidget中每條記錄的復選框都取消。並且實現復選框的normal、hov、pressed三種狀態的顯示。三種狀態需要設置背景圖片。效果圖如下

                       

(1)   繼承QHeaderView,重寫繪制函數,繪制表頭,重寫鼠標移動函數,用來獲取鼠標位置,鼠標移動到復選按鈕上時,顯示高亮。重寫鼠標點擊函數,點擊復選框時,發送信號控制選中和取消。

頭文件:

#pragma once

#include <QHeaderView>

#include <QPainter>

#include <QMouseEvent>

using namespace std;

class MyQHeaderView : public QHeaderView

{

       Q_OBJECT

public:

       explicit MyQHeaderView(Qt::Orientation orientation, QWidget *parent = 0);

signals:

       void headCheckBoxToggled(bool checked);

 

protected:

       void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;

       void mousePressEvent(QMouseEvent *event);

       void mouseMoveEvent(QMouseEvent *event);

 

private:

       bool m_isOn;//是否選中

       QPoint m_mousePoint;//鼠標位置

       mutable QRect m_RectHeaderCheckBox;//復選框的位置

};

源文件

#include "QMyHeaderView.h"

 

MyQHeaderView::MyQHeaderView(Qt::Orientation orientation, QWidget *parent)

       : QHeaderView(orientation, parent)

       , m_isOn(false)

{

       m_isOn = false;

       m_mousePoint.setX(100);

       m_mousePoint.setY(100);

}

 

/*繪制表頭logicalIndex表示表頭第幾列,0表示第0列,也就是我們要畫復選框的列,rect是表頭第一列的大小*/

void MyQHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const

{

       painter->save();

       QHeaderView::paintSection(painter, rect, logicalIndex);

       painter->restore();

       if (logicalIndex == 0)//第一列

       {

              //保存第一列的位置

              m_RectHeaderCheckBox.setX(rect.x() + 3);

              m_RectHeaderCheckBox.setY(rect.y() + 10);

              m_RectHeaderCheckBox.setWidth(14);

              m_RectHeaderCheckBox.setHeight(14);    

              QStyleOptionButton option;

              QPixmap pix;

              if (m_isOn)

              {//圖片需要在資源里添加

                     pix.load(":/checkImage/image/checkImage/check-sel.png");//選中

                     option.state = QStyle::State_On;

              }

              else if (m_RectHeaderCheckBox.contains(m_mousePoint))

              {

                     pix.load(":/checkImage/image/checkImage/check-hov.png");//高亮

                     option.state = QStyle::State_HasFocus;

              }

              else

              {

                     pix.load(":/checkImage/image/checkImage/check-nor.png");//正常

                     option.state = QStyle::State_Off;

              }

              style()->drawItemPixmap(painter, rect, Qt::AlignLeft | Qt::AlignVCenter, pix);

              //方法2,畫選擇按鈕,,無法設置背景圖片

              //

              //option.rect = m_RectHeaderCheckBox;

              //QIcon icon(pix);

              //option.icon = icon;//setStyleSheet("background");

              //style()->drawControl(QStyle::CE_CheckBox, &option, painter);

       }

}

 

void MyQHeaderView::mousePressEvent(QMouseEvent *event)

{

       //表頭可控制,鼠標第一個列,鼠標在矩形范圍內

      if (isEnabled() && logicalIndexAt(event->pos()) == 0&&m_RectHeaderCheckBox.contains(event->pos()))

       {

              m_isOn = !m_isOn;

              updateSection(0);//刷新表頭第一列

              emit headCheckBoxToggled(m_isOn);

       }

       else QHeaderView::mousePressEvent(event);

}

void MyQHeaderView::mouseMoveEvent(QMouseEvent *event)

{

       //保存鼠標的位置

       m_mousePoint = event->pos();

       if (m_RectHeaderCheckBox.contains(m_mousePoint))

       {

              updateSection(0);//重繪表頭復選框

       }

        QHeaderView::mouseMoveEvent(event);

}

(2)   Qdesign中加入QTablewidget,並添加表頭字段,第一個為空,用於添加選擇復選框。

 

(3)   在主界面類中new一個表頭對象,設置到QtableWidget

//new表頭對象

MyQHeaderView*myHeader = new MyQHeaderView(Qt::Horizontal, ui.tableWidget);

myHeader->setStretchLastSection(true);

myHeader->setStyleSheet("alignment: left;");

//連接單擊信號槽,在槽函數中

QObject::connect(myHeader, &MyQHeaderView::headCheckBoxToggled, this, &AlarmCenter::SetAlarmListCheckState);

ui.tableWidget->setHorizontalHeader(myHeader);//設置表頭

(4)   至於QTableWidget表格中數據前面的復選框則是用CheckBox

QCheckBox *CheckBox = new QCheckBox(ui.tableWidget);

QSize size(39, 35);

CheckBox->setFixedSize(size);

CheckBox->setCheckState(Qt::Unchecked);

//創建單擊選中的信號槽連接

QObject::connect(CheckBox, &QCheckBox::clicked,this, [=]()

{

       AlarmTableItemChoosed(row, 0);

});

ui.tableWidget->setCellWidget(row, 0, CheckBox);//row行,0列

 

 

 

自己編了一個股票監控軟件,有如下功能,有興趣的朋友可以下載;

(1)   個股監測。監測個股實時變化,可以監測個股大單交易、急速拉升和下降、主力入場和出場、股票最高點和最低點提醒。檢測到最高點、最低點、主力進場點、主力退場點、急速拉升點、急速下跌點,給出語音或者聲音提醒,不用再時刻看着大盤了,給你更多自由的時間;

(2)   大盤監測。監測大盤的走勢,采用上證、深證、創業三大指數的綜合指數作為大盤走勢。並實時監測大盤的最高點和最低點、中間的轉折點。

(3)   股票推薦。還能根據歷史數據長期或短期走勢進行分析,對股市3千多個股票進行分析對比,選出漲勢良好的股票,按照增長速度從大到小排序,推薦給你漲勢良好的股票;

下載地址:

1.0.3版本(修復大盤指數崩潰缺陷)下載地址:

鏈接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取碼:003h

更新鏈接:

https://www.cnblogs.com/bclshuai/p/10621613.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM