QTableWidget实现行选、列选

来源:互联网 发布:3d2015历史开奖数据 编辑:程序博客网 时间:2024/05/18 07:40

行选逻辑:

1.获取总列数

2.统计该行有哪几列被选中

3.如果被选中数量和总列数一致,则说明该行所有列均已经被选中,则将该列全部复选框去使能,实现反选择即该行全部不选择

4.如果被选中的列数为0或者和总列数不一致,则将没有选中的列复选框使能实现选中,也就是实现该行的所有列都被选中


列选逻辑:同行选逻辑原理一致。


设计槽

在构造函数创建信号

connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)),this, SLOT(checkColumnSlot(int)));connect(ui->tableWidget->verticalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(checkRowSlot(int)));

这里使用到了QTableWidget的两个方法分别是ui->tableWidget->horizontalHeader(),ui->tableWidget->verticalHeader()函数原型如下:

QHeaderView * QTableView::​horizontalHeader() const 返回图表视图的横向表头

QHeaderView * QTableView::​horizontalHeader() const 返回图表视图的竖向表头

这两个函数是QHeaderView类型,触发消息使用的是QHeaderView类中void QHeaderView::​sectionClicked(int logicalIndex)信号触发checkColumnSlot(int)或者checkRowSlot(int)槽进行行选或者列选。​sectionClicked的作用是当鼠标被按下的时候会触发消息,将行号或者列号的索引值发出,请注意,sectionpressed信号也会一并发出。具体细节可参考QHeaderView类。

测试源码:

//tablewidgetdemo.pro#-------------------------------------------------## Project created by QtCreator 2017-04-10T14:09:16##-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = tableWidgetDemoTEMPLATE = appSOURCES += main.cpp\        tablewidgetdemo.cppHEADERS  += tablewidgetdemo.hFORMS    += tablewidgetdemo.ui//tablewidgetdemo.h#ifndef TABLEWIDGETDEMO_H#define TABLEWIDGETDEMO_H#include <QMainWindow>namespace Ui {class tableWidgetDemo;}class tableWidgetDemo : public QMainWindow{    Q_OBJECTpublic:    explicit tableWidgetDemo(QWidget *parent = 0);    ~tableWidgetDemo();private slots:    void on_printBtn_clicked();    void checkColumnSlot(int index);    void checkRowSlot(int row);private:    Ui::tableWidgetDemo *ui;    void initTableWidget();};#endif // TABLEWIDGETDEMO_H//main.cpp#include "tablewidgetdemo.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    tableWidgetDemo w;    w.show();    return a.exec();}//tablewidgetdemo.cpp#include "tablewidgetdemo.h"#include "ui_tablewidgetdemo.h"#include <QDebug>tableWidgetDemo::tableWidgetDemo(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::tableWidgetDemo){    ui->setupUi(this);    this->setWindowTitle("tableWidgetDemo");    initTableWidget();    connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)),this, SLOT(checkColumnSlot(int)));    connect(ui->tableWidget->verticalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(checkRowSlot(int)));}tableWidgetDemo::~tableWidgetDemo(){    delete ui;}void tableWidgetDemo::initTableWidget(){    int row = 4;    int column = 5;    ui->tableWidget->clear();    ui->tableWidget->setRowCount(row);//设置行数    ui->tableWidget->setColumnCount(column);    QStringList header;    header <<"第一列"<<"第二列"<<"第三列"<<"第四列"<<"第五列";    ui->tableWidget->setHorizontalHeaderLabels(header);    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//关键    ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//列等宽    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止编辑    QString str;    int i = 0,j = 0;    for(i = 0;i < row;i++)    {        for(j = 0; j < column; j++)        {            QTableWidgetItem *checkBox = new QTableWidgetItem();            checkBox->setCheckState(Qt::Unchecked);            str.sprintf("行:%d列:%d",i,j);            checkBox->setText(str.toStdString().c_str());            ui->tableWidget->setItem(i, j, checkBox);        }    }}void tableWidgetDemo::checkRowSlot(int row){    int column = ui->tableWidget->columnCount();//总列数    int column_count = 0;//实际选中的行数 + 空行数    int i = 0;    for(i = 0;i < column;i++)//统计实际选中的行数    {        QTableWidgetItem *item = ui->tableWidget->item(row,i);        if(!item)        {            column_count++;            continue;        }        if(item->checkState() == Qt::Checked)            column_count++;    }    if((column - column_count) > 0)//说明没有被完全选中,则置为全选状态    {        for(i = 0;i < column;i++)        {            QTableWidgetItem *item = ui->tableWidget->item(row,i);            if(!item)                continue;            if(item->checkState() != Qt::Checked)                item->setCheckState(Qt::Checked);        }    }    else//说明被完全选中,则置为全未选中选状态    {        for(i = 0;i < column;i++)        {            QTableWidgetItem *item = ui->tableWidget->item(row,i);            if(!item)                continue;            if(item->checkState() == Qt::Checked)                item->setCheckState(Qt::Unchecked);        }    }}void tableWidgetDemo::checkColumnSlot(int column){    int row = ui->tableWidget->rowCount();//总行数    int row_count = 0;//实际选中的行数 + 空行数    int i = 0;    for(i = 0;i < row;i++)    {        QTableWidgetItem *item = ui->tableWidget->item(i,column);        if(!item)        {            row_count++;            continue;        }        if(item->checkState() == Qt::Checked)            row_count++;    }    if((row - row_count) > 0)//说明没有被完全选中,则置为全选状态    {        for(i = 0;i < row;i++)        {            QTableWidgetItem *item = ui->tableWidget->item(i,column);            if(!item)                continue;            if(item->checkState() != Qt::Checked)                item->setCheckState(Qt::Checked);        }    }    else//说明被完全选中,则置为全未选中选状态    {        for(i = 0;i < row;i++)        {            QTableWidgetItem *item = ui->tableWidget->item(i,column);            if(!item)                continue;            if(item->checkState() == Qt::Checked)                item->setCheckState(Qt::Unchecked);        }    }}void tableWidgetDemo::on_printBtn_clicked(){    int row = ui->tableWidget->rowCount();//行    int column = ui->tableWidget->columnCount();//列    int i,j = 0;    for(i = 0;i < row;i++)    {        for(j = 0;j < column;j++)        {            QTableWidgetItem *item = ui->tableWidget->item(i,j);            if(!item)                continue;            if(item->checkState() == Qt::Checked) //选中                qDebug()<<item->text();        }    }}

//tablewidgetdemo.ui



原创粉丝点击