QTableView的一些使用方法

本文详细介绍了如何在Qt中的QTableView中进行行列大小调整,合并单元格,嵌入QCheckBox控件,以及添加右键菜单功能,包括信号槽连接和具体实现方法。
摘要由CSDN通过智能技术生成

1.QTableVie行列大小调整

  • QHeaderView::Interactive:允许用户通过拖拽表头来改变列或行的大小,也可以通过程序调用 resizeSection() 函数来改变大小。默认情况下,列或行的大小为 defaultSectionSize。该模式支持级联大小调整(cascadingSectionResizes)。
  • QHeaderView::Fixed:禁止用户通过拖拽表头来改变列或行的大小,只能通过程序调用 resizeSection() 函数来改变大小。默认情况下,列或行的大小为 defaultSectionSize。
  • QHeaderView::Stretch:根据可用空间自动调整列或行的大小,无法被用户或程序修改。在可用空间发生变化时,列或行的大小会随之自动调整。
  • QHeaderView::ResizeToContents:根据列或行的内容自动调整大小,无法被用户或程序修改。该模式仅适用于单元格内容不经常更改且具有相似尺寸的情况,否则可能导致表格的布局混乱。该模式从 Qt 4.2 版本开始引入。
    以上常量可以使用 QHeaderView 的 setSectionResizeMode() 函数进行设置,以实现表头视图列或行的大小调整。
	// 获取表格视图的水平标头
	QHeaderView* headerView = ui.tableView->horizontalHeader();
	headerView->setSectionResizeMode(QHeaderView::Interactive);
	//自动调节所有列宽
	ui.tableView->resizeColumnsToContents();
	//最后一列填满表格
	ui.tableView->horizontalHeader()->setStretchLastSection(true);
	//表格不可编辑
	ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
	//去掉网格
	ui.tableView->setShowGrid(false);
	//设置垂直表头不可见
	ui.tableView->verticalHeader()->setVisible(false);
	//隐藏滚动条
	ui.tableView->verticalScrollBar()->setVisible(false);
	// 禁用滚动
	ui.tableView->verticalScrollBar()->setDisabled(true); 
	//设置表头样式
	ui.tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:#E8F0F5;}");
	设置为不可编辑
	ui.tableView->horizontalHeader()->setEditTriggers(QAbstractItemView::NoEditTriggers);
	//隔行变色
	ui.tableView->setAlternatingRowColors(true);

2.合并单元格

tableView.setSpan()函数用于合并单元格,并接受四个参数,它们的含义如下:

  • row:要合并的起始行索引。
  • column:要合并的起始列索引。
  • rowSpan:要合并的行数(包括起始行)。
  • columnSpan:要合并的列数(包括起始列)。
    简而言之,这些参数决定了要合并的单元格的位置和跨度。

在示例中,tableView.setSpan(0, 1, 1, 2)的意思是从第0行、第1列开始,合并1行和2列,也就是将第一行的第2列和第3列合并成一个单元格。同样地,tableView.setSpan(1, 1, 1, 2)表示从第1行、第1列开始,合并1行和2列,即将第二行的第2列和第3列合并成一个单元格。
这样,通过设置适当的参数,您可以根据需要合并QTableView中的单元格。
示例

#include <QStandardItemModel>
#include <QTableView>
#include <QItemSelectionModel>
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStandardItemModel model(4, 4); // 创建一个4x4的模型
 
	// 设置一些数据
	model.setItem(0, 0, new QStandardItem("A"));
	model.setItem(0, 1, new QStandardItem("B"));
	model.setItem(0, 2, new QStandardItem("B"));
	model.setItem(0, 3, new QStandardItem("C"));
	model.setItem(1, 0, new QStandardItem("D"));
	model.setItem(1, 1, new QStandardItem("E"));
	model.setItem(1, 2, new QStandardItem("E"));
	model.setItem(1, 3, new QStandardItem("F"));
	model.setItem(2, 0, new QStandardItem("G"));
	model.setItem(2, 1, new QStandardItem("H"));
	model.setItem(2, 2, new QStandardItem("I"));
	model.setItem(2, 3, new QStandardItem("J"));
	model.setItem(3, 0, new QStandardItem("K"));
	model.setItem(3, 1, new QStandardItem("L"));
	model.setItem(3, 2, new QStandardItem("L"));
	model.setItem(3, 3, new QStandardItem("M"));
	
	QTableView tableView;
	tableView.setModel(&model);
	tableView.verticalHeader()->setVisible(false);
	tableView.horizontalHeader()->setVisible(false);
	// 合并单元格
	tableView.setSpan(0, 1, 1, 2); // 合并第一行的2、3列
	tableView.setSpan(1, 1, 1, 2); // 合并第二行的2、3列
	tableView.setSpan(2, 0, 2, 1); // 合并第一列的3,4行
	tableView.show();
 
	return a.exec();
}

效果
在这里插入图片描述

3.表格里面嵌入控件(QCheckBox)

先占位,再往里面放控件

void CShowInterpretWidget::setDataToTableView()
{
	m_model = new QStandardItemModel();
	ui.tableView->setModel(m_model);//这行代码要放在前面,也就是model进行操作之前,不然控件放不进表格
	for (int i=0; i < m_nameList.size(); i++)
	{
		QStandardItem* t_item = new QStandardItem();
		QWidget* t_checkWidget = new QWidget();
		QHBoxLayout* t_hLayout = new QHBoxLayout;//使用布局是为了更好调整控件的位置
		QCheckBox *t_checkBox = new QCheckBox(t_checkWidget);
		t_checkBox->setChecked(true);
		connect(t_checkBox, &QCheckBox::stateChanged, this, &CShowInterpretWidget::slotCheckBoxCtrl);//为QCheckBox连接槽函数
		t_hLayout->addWidget(t_checkBox);
		t_checkWidget->setLayout(t_hLayout);
		m_model->setItem(i, 0, t_item);
		ui.tableView->setIndexWidget(m_model->index(i,0),t_checkWidget);//这行代码就是将控件放进表格里面
		m_model->setItem(i, 1, new QStandardItem(m_nameList.at(i)));
		//model->item(i)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//文字居中
	}
	ui.tableView->resizeColumnsToContents();//自动调节所有列宽
	ui.tableView->horizontalHeader()->setStretchLastSection(true);//最后一列填满表格
	ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//表格不可编辑
	ui.tableView->setShowGrid(false);//去掉网格
}


4.QTableView里面存放按钮,点击按钮获取所在行

void slotButtonClicked()
{
    QPushButton* clickedButton = qobject_cast<QPushButton*(QObject::sender());
    if (clickedButton)
     {
     // 替换为实际的QTableView指针
        QTableView* tableView = ui.tableViewWait; 
        for (int row = 0; row < tableView->model()->rowCount(); ++row)
         {
         	// 假设按钮位于第3列
            QModelIndex index = tableView->model()->index(row, 2); 
            if (tableView->indexWidget(index) == clickedButton) 
            {
                qDebug() << "Clicked button in row: " << row;
                break;
            }
        }
    }
}

5.QTableView添加右键菜单功能

1.信号槽连接

ui.tableView->setContextMenuPolicy(Qt::CustomContextMenu);//右键菜单
connect(ui.tableView, &QTableView::customContextMenuRequested, this, &CShowInterpretWidget::slotShowMenu);

2.槽函数

void CShowInterpretWidget::slotShowMenu(const QPoint &pos)
{
	// 获取右键时 Qtableview 中的项
	QModelIndex t_index = ui.tableView->indexAt(pos);

	if (t_index.isValid())
	{
		m_cwName = t_index.data().toString();
		Q_UNUSED(pos);
		m_mainMenu = new QMenu(this);
		m_mainMenu->addAction(QString::fromLocal8Bit("修改信息"));
		m_mainMenu->addSeparator();
		m_mainMenu->addAction(QString::fromLocal8Bit("隐藏"));
		m_mainMenu->addSeparator();
		m_mainMenu->addAction(QString::fromLocal8Bit("显示"));
		m_mainMenu->addSeparator();
		m_mainMenu->addAction(QString::fromLocal8Bit("删除"));
		connect(m_mainMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotShowModifyWind(QAction*)));//这行代码似乎只能放在exec前面。这里是菜单的里面的信号槽
		m_mainMenu->exec(QCursor::pos());
	}

}

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值