QTableWidget实现行选列选
Posted kongslly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QTableWidget实现行选列选相关的知识,希望对你有一定的参考价值。
行选逻辑:
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 gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = tableWidgetDemo
TEMPLATE = app
SOURCES += main.cpp\\
tablewidgetdemo.cpp
HEADERS += tablewidgetdemo.h
FORMS += tablewidgetdemo.ui
//tablewidgetdemo.h
#ifndef TABLEWIDGETDEMO_H
#define TABLEWIDGETDEMO_H
#include <QMainWindow>
namespace Ui
class tableWidgetDemo;
class tableWidgetDemo : public QMainWindow
Q_OBJECT
public:
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
源码下载:
以上是关于QTableWidget实现行选列选的主要内容,如果未能解决你的问题,请参考以下文章