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
阅读全文
0 0
- QTableWidget实现行选、列选
- QTableWidget自动调整列宽和行高
- QTableView、QTableWidget设置默认行高和列宽
- QTableWidget 实现整行拖放交换位置
- QTableWidget 的多选处理 办法
- QTableWidget实现鼠标移动整行颜色变化
- 【Qt开发】QTableWidget设置根据内容调整列宽和行高
- 使QtableWidget表格中的列平均填充
- 设置qtablewidget 某些列不能被修改
- 在QTableWidget的列头增加Checkbox
- QTableWidget列宽随心设置参考
- QTableWidget设置某列不可编辑
- PyQt5设置QTableWidget列宽固定
- Qtablewidget设置某一列不可编辑
- QTableWidget 实现自定义代理(delegate)
- QTableWidget如何实现换行功能?
- 改变QTableWidget 行高
- QTableWidget删除行出错
- python3 requests的content和text方法
- 关于CSS选择器
- 生产者与消费者
- leetCode:4Sum
- ubuntu进入vi编辑模式怎么删除内容
- QTableWidget实现行选、列选
- USACO-Section1.3 Wormholes 【深度优先搜索】【暴力枚举】
- Radius协议简单介绍
- 欧几里得算法与不定方程
- 信号量和条件变量与互斥锁
- 接受月份值,返回季度名称
- Android Studio——修改代码主题
- (XAMPP)80端口被NT kernel & System 占用pid 4
- 关闭selinux