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
