今天晚上花点时间研究一下表格列的显隐问题(类似与excel的隐藏列功能),在网络上搜罗了一通资料,没现成的例子作为借鉴,只能自己研究编写了。现在将过程记录下来,以便日后翻阅。
首先声明:因为时间仓促,以下例子写的不是很规范,只是为了实现特定功能,如果哪位仁兄想要借鉴,只能自己完善优化以下了。示例运行后的如下图所示:
1.创建项目工程
1.创建TableLearn工程,只包括以下文件。
2.资源mainwindow.ui中拉入一个QTableWidget,瞎输入几行几列。其中类目1、类目2、类目3左右显隐节点,分别显隐对应的子集。
2.显隐按钮添加
1.在类目1、类目2、类目3位置创建3个按钮,分别用于显隐触发各自的子项。按钮存放到QButtonGroup中用于统一建议按钮的信号槽映射关系。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QButtonGroup>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void UpdateButtonPos(int buttonId);
private slots:
void on_buttonClicked(int id);
private:
Ui::MainWindow *ui;
QButtonGroup *m_buttonGroup;
};
#endif // MAINWINDOW_H
2.按钮位置设置与信号槽绑定过程
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_buttonGroup = new QButtonGroup();
QPushButton *button1 = new QPushButton("-",this);
QTableWidgetItem *item = ui->tableWidget->item(0,0);
//获取单元格坐标位置
QRect rect = ui->tableWidget->visualItemRect(item);
button1->setGeometry(rect.x() + rect.width(),rect.y(),36,36);
m_buttonGroup->addButton(button1,0);
QPushButton *button3 = new QPushButton("-",this);
item = ui->tableWidget->item(0,3);
//获取单元格坐标位置
rect = ui->tableWidget->visualItemRect(item);
button3->setGeometry(rect.x() + rect.width(),rect.y(),36,36);
m_buttonGroup->addButton(button3,3);
QPushButton *button6 = new QPushButton("-",this);
item = ui->tableWidget->item(0,6);
//获取单元格坐标位置
rect = ui->tableWidget->visualItemRect(item);
button6->setGeometry(rect.x() + rect.width(),rect.y(),36,36);
m_buttonGroup->addButton(button6,6);
connect(m_buttonGroup,SIGNAL(buttonClicked(int)),this,SLOT(on_buttonClicked(int)));
}
3. 按钮点击处理
void MainWindow::on_buttonClicked(int id)
{
if(id == 0)
{
if(m_buttonGroup->button(id)->text() == "□")
{
ui->tableWidget->setColumnHidden(1,false);
ui->tableWidget->setColumnHidden(2,false);
m_buttonGroup->button(id)->setText("-");
}
else
{
ui->tableWidget->setColumnHidden(1,true);
ui->tableWidget->setColumnHidden(2,true);
m_buttonGroup->button(id)->setText("□");
}
}
else if(id == 3)
{
if(m_buttonGroup->button(id)->text() == "□")
{
ui->tableWidget->setColumnHidden(4,false);
ui->tableWidget->setColumnHidden(5,false);
m_buttonGroup->button(id)->setText("-");
}
else
{
ui->tableWidget->setColumnHidden(4,true);
ui->tableWidget->setColumnHidden(5,true);
m_buttonGroup->button(id)->setText("□");
}
}
else if(id == 6)
{
if(m_buttonGroup->button(id)->text() == "□")
{
ui->tableWidget->setColumnHidden(7,false);
m_buttonGroup->button(id)->setText("-");
}
else
{
ui->tableWidget->setColumnHidden(7,true);
m_buttonGroup->button(id)->setText("□");
}
}
UpdateButtonPos(0);
UpdateButtonPos(3);
UpdateButtonPos(6);
}
4.按钮位置更新
void MainWindow::UpdateButtonPos(int buttonId)
{
//移动按钮
QRect rect = ui->tableWidget->visualItemRect(ui->tableWidget->item(0,buttonId));
m_buttonGroup->button(buttonId)->move(rect.x()+rect.width(),rect.y());
}