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实现行选列选的主要内容,如果未能解决你的问题,请参考以下文章

C#总结DataGridView增加全选列

盘一盘Tidyverse| 只要你要只要我有-filter 筛选行

pyqt5 从下拉列选后一一添加到lineedit?

QTableWidget单元格自动分行显示

QTableWidget单元格自动分行显示

QTableWidget单元格自动分行显示