【Qt编程之Widgets模块】-004:QTableWidget及基本操作

1. 概述

  • QTableWidget 是 Qt 中的表格组件类。在窗体上放置一个 QTableWidget 组件后,可以在 Property Editor 里对其进行属性设置,双击这个组件,可以打开一个编辑器,对其 Colum、Row 和 Item 进行编辑。
    在这里插入图片描述
  • 表格的第 1 行称为行表头,用于设置每一列的标题,第 1 列称为列表头,可以设置其标题,但一般使用缺省的标题,即为行号。行表头和列表头一般是不可编辑的。

  • 除了行表头和列表头之外的表格区域是内容区,内容区是规则的网格状,如同一个二维数组,每个网格单元称为一个单元格。每个单元格有一个行号、列号,图 1 表示了行号、列号的变化规律。

  • 在 QTableWidget 表格中,每一个单元格是一个 QTable Widgetltem 对象,可以设置文字内容、字体、前景色、背景色、图标,也可以设置编辑和显示标记。每个单元格还可以存储一个 QVariant 数据,用于设置用户自定义数据。

2. 主要操作函数

2.1 QTableWidgets实例化

  • 根据QTableWidget的构造函数,我们在定义实例化的时候可以指定显示的行数和列数,也可以在QTableWidget实例化之后通过成员函数进行设定:
        self.table = QTableWidget(5,2)
或者
        self.table = QTableWidget()
        self.table.setColumnCount(5)
        self.table.setRowCount(2)

2.2 设置表头 setHorizontalHeaderLabels

  • 在table表头分为水平和垂直两种,及horizontal header和vertical header两类。

  • 添加表头:
    可以添加水平和垂直表头,QtWidgets提供两个方法(setHorizontalHeaderLabels()和setVerticalHeaderLabels())来添加,如下为添加水平表头。

horizontalHeader = ["工号","姓名","性别","年龄","职称"]
self.table = QTableWidget()
self.table.setHorizontalHeaderLabels(horizontalHeader)
  • 表头的隐藏和显示:
    根据不同的应用场景可能需要对于表头进行隐藏和显示的操作,直接对表头进行操作。
    如下隐藏了垂直的表头:
self.table = QTableWidget()
self.table.verticalHeader().setVisible(False)
  • 表头字体,颜色的设定:
    由于表头也是由多个item构成的,所以通过循环操作对每一个item进行操作。
self.table = QTableWidget()
for index in range(self.table.columnCount()):
headItem = self.table.horizontalHeaderItem(index)
headItem.setFont(QFont("song", 12, QFont.Bold))
headItem.setForeground(QBrush(Qt.gray))
headItem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
  • 插入标题
//新增或修改水平标题
ui.tableWidget->setColumnCount(5);	//设置列数
ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromLocal8Bit("新增列001")));
ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem);
ui.tableWidget->horizontalHeaderItem(1)->setText(QString::fromLocal8Bit("新增列002"));
//可以一次设置一组标题
void setHorizontalHeaderLabels(const QStringList &labels);
  • 设置行表头、列表头是否显示:horizontalHeader()获取行表头,verticalHeader()获取列表头,然后可设置其可见性。
void MainWindow::on_chkBoxHeaderH_clicked(bool checked)
{
   //是否显示水平表头
   ui->tableInfo->horizontalHeader()->setVisible(checked);
}
void MainWindow::on_chkBoxHeaderV_clicked(bool checked)
{
   //是否显示垂直表头
   ui->tableInfo->verticalHeader()->setVisible(checked);
}

QStringList   header;
header << tr("") << tr("User ID")<< tr("User Name")<<tr("User Role")<< tr("Enable State") << tr("Other Info") << tr("Operation");
ui.tableWidget->setHorizontalHeaderLabels(header);

2.3 单元格选择:setSelectionBehavior

比如我们在单击某个单元格的时候,此时默认的行为是选中单元格,还是单元格所在的行或列,这个可以通过setSelectionBehavior()方法设定。如下为默认选中列:

self.table = QTableWidget()
self.table.setSelectionBehavior(QTableWidget.SelectColumns)


QTableWidget.SelectItems 0 Selecting single items.选中单个单元格
QTableWidget.SelectRows 1 Selecting only rows.选中一行
QTableWidget.SelectColumns 2 Selecting only columns.选中一列

2.4 设置列数 setColumnCount

// 设置列数
ui.tableWidget->setColumnCount(7);

2.5 设置行数 setRowCount

  // 设置行数
 ui.tableWidget->setRowCount(0);```

2.6 网格的显示 setShowGrid

通常默认的情况下需要显示表格的网格线,在一些场景下不需要显示网格线。则需要将对应的横竖线进行隐藏:

self.table = QTableWidget()
self.table.setShowGrid(False)

setShowGrid(),False不显示网格线,True显示网格线

2.7 添加表项 setItem

由于整个表格是由一个个单元格组成,所以需要将单个的表格项添加到整个表格中。通过setItem()进行操作,如下为添加一个为str类型内容的表格:

self.table = QTableWidget()
 self.table.setItem(0,0, QTableWidgetItem("001"))


setItem(int , int , QTableWidgetItem )1个参数 行号,从0开始
第2个参数 列号,从0开始
第3个参数 QTableWidgetItem对象。

2.8 表项添加自定义控件 setCellWidget

比如在有些表项中需要QComboBox来实现下拉框的功能,比如性别选择的时候就可以通过下拉框来实现选择。

self.table = QTableWidget()
genderComb = QComboBox()
genderComb.addItem("男性")
genderComb.addItem("女性")
genderComb.setCurrentIndex(0)
self.table.setCellWidget(0,2,genderComb)

实例化一个QComboBox对象,通过setCellWidget()将QComboBox添加到指定的单元格中。通过行号和列号唯一确定一个单元格。
setCellWidget(int int , QWidget )
第1个参数 行号,从0开始
第2个参数 列号,从0开始
第3个参数 QWidget 对象。

2.9 单元格操作 setTextAlignment

单元格对齐方式
在单元格中操作字符显示的是否,常常需要操作各种对齐,比如水平的左对齐、右对齐、居中等,垂直的靠上、靠下对齐等方式。

headItem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)

通过setTextAlignment()方法来设定,由于需要同时考虑水平和垂直方向,所以通过或‘|’的方式将两个方向的对齐组合起来,如Qt.AlignLeft | Qt.AlignVCenter。水平方向:

水平方向Value
Qt.AlignLeft 0x0001Aligns with the left edge.
Qt.AlignRight 0x0002Aligns with the right edge.
Qt.AlignHCenter 0x0004Centers horizontally in the available space.
Qt.AlignJustify 0x0008Justifies the text in the available space.
垂直方向Value
Qt.AlignTop0x0020 Aligns with the top.
Qt.AlignBottom0x0040 Aligns with the bottom.
Qt.AlignVCenter0x0080 Centers vertically in the available space.

2.10 单元格大小设定 setColumnWidth setRowHeight

有时候需要根据显示的要求来调整单元格的大小,行的宽度和列的高度。

self.table = QTableWidget()
self.table.setColumnWidth(4,200)
self.table.setRowHeight(0,40)

通过setColumnWidth()和setRowHeight()设定特定行或者列上的大小。

有时候需要根据显示的内容自动调整单元格的大小,类似office中的内容相匹配。

self.table = QTableWidget()
self.table.resizeColumnsToContents()
self.table.resizeRowsToContents()

2.11 动态插入行列 insertRow

  • 当初始的行数或者列数不能满足需要的时候,我们需要动态的调整表格的大小,如入动态的插入行:
self.table = QTableWidget()
row_count = self.table.rowCount()
self.table.insertRow(row_count)

本例中为插入到最后一行的后面。insertColumn()动态插入列。

insertRow(int)、insertColumn(int),指定位置插入行或者列

2.12 动态移除行列removeColumn removeRow

removeColumn(int column) 移除column列及其内容。
removeRow(int row)移除第row行及其内容。

self.table = QTableWidget()
row_count = self.table.rowCount()
self.table.removeRow(row_count-1)

2.13 其他操作 clear setSpan

clear() 清除所有表项及表头
setSpan(int , int , int , int ),合并单元格

2.14 选择模式 setSelectionMode

行选择方式:
比如我们需要同时选择不相邻的多个函数的时候,在excell中我们通过按shift然后点击鼠标来选择多行。在QtWidget也存在类似行为,我们可以通过setSelectionMode()方法来实现:

self.table = QTableWidget()
self.table.setSelectionMode(QTableWidget.SingleSelection  )

可以设定的选择模式:
QTableWidget.NoSelection 不能选择
QTableWidget.SingleSelection 选中单个目标
QTableWidget.MultiSelection 选中多个目标
QTableWidget.ExtendedSelection shift键的连续选择
QTableWidget.ContiguousSelection ctrl键的不连续的多个选择

此属性保存视图在哪种选择模式下运行。此属性控制用户是否可以选择一个或多个项目,并且在多个项目选择中控制选择是否必须是连续范围的项目。

/*设置选择一行*/
setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionBehavior(QAbstractItemView::SelectRows);
/*设置选择一个*/
setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionBehavior(QAbstractItemView::SelectItems);

诸如此类:

项目Value
QAbstractItemView::SingleSelection当用户选择一个项目时,任何已选择的项目都将变为未选择状态,并且用户无法通过单击来取消选择该项目。
QAbstractItemView::ContiguousSelection当用户以常规方式选择一个项目时,将清除选择并选择新的项目。但是,如果用户在单击某个项目时按下Shift键,则根据单击项目的状态,选择或取消选择当前项目和单击项目之间的所有项目。
QAbstractItemView::ExtendedSelection当用户以常规方式选择一个项目时,将清除选择并选择新的项目。但是,如果用户在单击某个项目时按下Ctrl键,则被单击的项目将被切换,而其他所有项目则保持不变。如果用户在单击某个项目时按下Shift键,则根据该单击项目的状态,选择或取消选择当前项目和单击项目之间的所有项目。可以通过将鼠标拖动到多个项目上来选择多个项目。
QAbstractItemView::MultiSelection当用户以通常的方式选择一个项目时,该项目的选择状态将被切换,而其他项目将被保留。可以通过在它们上方拖动鼠标来切换多个项目。
QAbstractItemView::NoSelection无法选择项目。
不变 值描述
QAbstractItemView::SelectItems0 选择单个项目。
QAbstractItemView::SelectRows1 仅选择行。
QAbstractItemView::SelectColumns2 仅选择列。

2.15 设置表格内容是否可编辑 setEditTriggers

  • 设置表格内容是否可编辑:QTableWidget 的 EditTriggers 属性表示是否可编辑,以及进入编辑状态的方式。界面上的"表格可编辑"复选框的槽函数代码为:
  • 在表格的应用中,我们需要对表格的样式,编辑模式,选择行为进行设置。
    编辑方式:
    对于表格中的数据,默认只要双击就可以修改其中的数据。如果文档是处于预览状态或者不可编辑状态,那就需要对表格设定为不可编辑模式。
void MainWindow::on_chkBoxTabEditable_clicked(bool checked)
{ 
	//设置编辑模式
	if (checked)
		//双击或获取焦点后单击,进入编辑状态
		ui->tableInfo->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
	else
		ui->tableInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
}
// 设置全部单元格可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged);
// 设置全部单元格不可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

// No editing possible. 不能对表格内容进行修改
ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

QAbstractItemView的参数介绍:

参数名解释
QAbstractItemView.NoEditTriggersNo editing possible. 不能对表格内容进行修改
QAbstractItemView.CurrentChangedEditing start whenever current item changes.任何时候都能对单元格修改
QAbstractItemView.DoubleClickedEditing starts when an item is double clicked.双击单元格
QAbstractItemView.SelectedClickedEditing starts when clicking on an already selected item.单击已选中的内容
QAbstractItemView.EditKeyPressedEditing starts when the platform edit key has been pressed over an item. 当在项目上按下平台编辑键时,编辑开始。
QAbstractItemView.AnyKeyPressedEditing starts when any key is pressed over an item.按下任意键就能修改
QAbstractItemView::AllEditTriggersEditing starts for all above actions.以上条件全包括
  • 设置表格部分单元格可编辑,部分不可编辑
// 设置QTableWidget可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged);
// 遍历表格的每一行
for(int i=0; i<ui->tableWidget->columnCount()-1; i++)
{
    QTableWidgetItem* item = ui->tableWidget->item(i,1); //获取每行第1列的单元格指针
    item->setFlags(Qt::ItemIsEnabled);//设置改item不可修改;
}

2.16 间隔行底色 setAltematingRowColors

  • setAltematingRowColors() 函数可以设置表格的行是否用交替底色显示,若为交替底色,则间隔的一行会用灰色作为底色。具体底色的设置需要用 styleSheet,在后续章节会有介绍。
ui->tableInfo->setAlternatingRowColors(checked);

2.17 QTableWidgetItem::setFlags介绍:

item->setFlags(Qt::ItemIsEnabled) 表格单元item不可编辑
item->setFlags(Qt::ItemIsEditable)   表格单元item可编辑

2.18 焦点事件 setFocusPolicy

  • 设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。
    一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)
 // 设置焦点
 ui.tableWidget->setFocusPolicy(Qt::NoFocus);
  • 设置获得焦点的方式
Constant ValueDescription
Qt::TabFocus0x1 通过Tab键获得焦点
Qt::ClickFocus0x2 通过被单击获得焦点
Qt::StrongFocusTabFocus
Qt::WheelFocusStrongFocus
Qt::NoFocus0 不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点.
  • 当前有焦点事件的窗口只能有一个,当一个窗口获取焦点事件或失去焦点事件时,可能需要相应的操作,或者如何判断一个才窗口有没有焦点事件。Qt中亦有相应的函数。
void QWidget::focusInEvent ( QFocusEvent * event ) [virtual protected]
void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]

这两个就是窗口获取或失去焦点事件的函数,需要我们重写(好多窗口都是从QWidget继承这两个函数的)

bool hasFocus () const

这个函数就是判断当前窗口有没有焦点事件的,返回布尔值。

void QWidget::setFocus ( Qt::FocusReason reason )
void QWidget::clearFocus ()

这两个函数就是设置或清除焦点事件的。

ConstantValueDescription
Qt::TabFocus0x1the widget accepts focus by tabbing.
Qt::ClickFocus0x2the widget accepts focus by clicking.
Qt::StrongFocusTabFocus1 ClickFocus 1 0x8the widget accepts focus by both tabbing and clicking. On Mac OS X this will also be indicate that the widget accepts tab focus when in ‘Text/List focus mode’.
Qt::WheelFocusStrongFocus 1 0x4like Qt::StrongFocus plus the widget accepts focus by using the mouse wheel.
Qt::NoFocus0the widget does not accept focus.

2.19 是否显示网格 setFocusPolicy

  • showGrid属性用于控制视图中数据项之间是否显示网格,如果该属性为True,则绘制网格;如果该属性为False,则不绘制网格。
  • showGrid属性默认值为True,可以通过showGrid() 和setShowGrid(bool show)来访问或设置该属性
 // 不显示网格
 ui.tableWidget->setShowGrid(false);

2.20 表头高度 setMinimumHeight

// 设置表头最小高度
ui.tableWidget->horizontalHeader()->setMinimumHeight(32);

2.21 清空单元格里面的内容 clear

void clear() | 清空单元格里面的内容,但是网格还在,表头也在

2.22 清空所有标题和内容 setColumnCount(0) setRowCount(0)

//显示的网格也会被删除
ui.tableWidget->setColumnCount(0);
ui.tableWidget->setRowCount(0);

2.23 设置指定宽度

//设置指定列的宽度,同理可设置指定行的宽度
 void setColumnWidth(int column, int width);

2.24 插入数据

方法一:先设置行数和列数,然后插入数据
void setColumnCount(int columns);	//设置列数
void setRowCount(int rows);	//设置行数
void setItem(int row, int column, QTableWidgetItem *item);	//设置单元格内容
方法二:先插入一行(尾部插入),然后插入数据
int row = ui.tableWidget->rowCount();	//获取行数
ui.tableWidget->insertRow(row);	//插入一行 插入的一行是一个空行
void setItem(int row, int column, QTableWidgetItem *item);	//设置单元格内容

开始位置插入一行
ui.tableWidget->insertRow(0);	//插入一行
void setItem(int row, int column, QTableWidgetItem *item);	//设置单元格内容

2.25 插入QIcont图片

ui.tableWidget->item(row, 0)->setIcon(QIcon(":/QtWidgetsApplication1/Resources/timg.gif"));

2.26 设置/获取行高

void setRowHeight(int row, int height);
int rowHeight(int row) const;

2.27 设置图标尺寸

void setIconSize(const QSize &size);

2.28 插入widget图片

QLabel *pLabel = new QLabel;
QPixmap pix(":/QtWidgetsApplication1/Resources/timg.gif");
//缩放到和表格单元的宽高一致
pix = pix.scaled(ui.tableWidget->columnWidth(0), ui.tableWidget->rowHeight(row));
pLabel->setPixmap(pix);
ui.tableWidget->setCellWidget(row, 0, pLabel);

2.29 删除一行或多行

注意:方法一,空行不会被选中,所以不会被删除

QList<QTableWidgetItem*> items = ui.tableWidget->selectedItems();	//如果是空行,则不会被选中
for (const auto &it : items)	//获取的是被选中的item,所以会有多个(如果是单行或是多行选中模式),此时需要去重复索引
{
   //ui.tableWidget->removeRow(it->row() );
   qDebug() << it->row() << " : " << it->column() << "=" << it->text() << endl;
}

方法二:空行会被选择到,会被删除

//选择模式器
QItemSelectionModel * model = ui.tableWidget->selectionModel();
//获取所有选择的索引
QModelIndexList indexList = model->selectedIndexes();
//获取所有被选中的行号
for (const auto &it : indexList)		//删除时应该注意去重复行号
{
   //ui.tableWidget->removeRow(it.row());
   qDebug() << it.row() << " : " << it.column() << "=" << endl;
}

2.30 获取水平或垂直方向上的表头

QHeaderView *horizontalHeader() const;
QHeaderView *verticalHeader() const;

2.31 表象单独存储用户数据

setdata()存储数据
data()取出数据
  • 通过setData(),我们可以单独存储用户数据,使用Qt::UserRole、Qt::UserRole + 1.。。。。
QListWidget *pListWidget = new QListWidget(this);
    int i = 0;
    for(i = 0; i  < 5; ++i )
    {
        QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
        pItem->setData(Qt::UserRole + 1, QString("数据 %1").arg(i));  // 用户数据
         pItem->setData(Qt::UserRole + 2, QString("测试 %1").arg(i));
        pItem->setText(QString("Item %1").arg(i));  // 文本
        pListWidget->addItem(pItem);
    }
    // 连接信号槽
    connect(pListWidget, &QListWidget::itemClicked, this, &Widget::onItemClicked);

槽函数取出数据

void onItemClicked(QListWidgetItem *item) {
    int nID = item->data(Qt::UserRole).toInt();  // 获取用户数据
    QString strName = item->data(Qt::UserRole + 1).toString();  // 获取用户数据
    QString strC = item->data(Qt::UserRole + 2).toString();
    qDebug() << "ID : " << nID;
    qDebug() << "Name : " << strName;
    qDebug() << "strC" << strC;
}

  • 也可以通过**setData()**进行整体存储,这时候只需要使用Qt::UserRole即可,把用户数据当成一个结构体来存储。
    1、定义一个结构体
//用户信息
struct User : QObjectUserData 
{
	int nID;	//ID
	QString strName;//用户名
}
QListWidget *pListWidget = new QListWidget(this);
int i = 0;
do {
    ++i;
    QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
    User user;
    user.nID = i;
    user.strName = QString("Qter %1").arg(i);
    pItem->setData(Qt::UserRole, QVariant::fromValue(user));  // 设置用户数据
    pItem->setText(QString("Item %1").arg(i));
    pListWidget->addItem(pItem);
} while (i < 5);

槽函数

void onItemClicked(QListWidgetItem *item) {
    QVariant variant = item->data(Qt::UserRole);  // 获取用户数据
    User user = variant.value<User>();
 
    qDebug() << "ID : " << user.nID;
    qDebug() << "Name : " << user.strName;
}

2.31 indexAt函数 返回QModelIndex

  • 要判断点击右键时鼠标指针是否在QTableView的Item上,如果是QTableWidget可以用itemAt来判断
    QTableView通过查看文档 发现有个indexAt函数 返回QModelIndex
QModelIndex QTableView::indexAt(const QPoint & pos) const [virtual]
Reimplemented from QAbstractItemView::indexAt().
Returns the index position of the model item corresponding to the table item at position pos in contents coordinates.

于是通过如下代码判断鼠标右键单击的时候,鼠标指针是否在item上

qDebug()<<ui->tableview->indexAt(ui->tableview->mapFromGlobal(QCursor::pos())).row();

可是发现一些问题:
当鼠标右键点击第一行的上边缘附近 返回0
点击第一行中间 返回1
点击最后一行中间就返回 -1

也就是说 点击行A的上边缘附近 返回的是A的上一行
只有点击行A的中间返回的才是A行
并不是 indexAt函数所描述的那样返回的是当前行

最后发现问题出在:
indexAt函数根据QPoint判断行的时候 是没有把 QTableView的表头去掉的 (HoriziotalHeader和VerticalHeader)
所以 隐藏表头后 就一切正常了
如果不愿意隐藏表头 我是用如下代码 解决的:

QPoint pt = ui->tableview->mapFromGlobal(QCursor::pos());
int height = ui->tableview->horizontalHeader()->height();
QPoint pt2(0,height);
pt+=pt2;
qDebug()<<ui->tableview->indexAt(pt).row();

现在debug输出就一切正常了(上面只是针对QtableView上面的horizontal表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。

2.32 QTableView表格视图的列宽设置

  • Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现。其中,QTableWidget只是对QTableView的一种简单封装。因为使用QTableView常常需要用户指定自定义的Model,这意味使用起来不够轻便。有时候我们只是想利用一些简单的表格功能,不需要对表格展示有多强大的控制。那么,QTableWidget便是一个不错的选择。这篇博文主要记录表格的列宽和行高的设置。

方法一:
恰当的设置表格的列宽往往能给表格的美观性带来较好的效果。一种简单的方法是:调用表头的setSectionResizeMode()方法,代码如下:

m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
  • 参数QHeaderView::ResizeToContens说明:调整列宽以适应单元内容。也就是说,当单元内的文本较长的时候,这种方法将会严重影响表格的阅读。这种方法只适合端文本内容的使用。此外,这种方法还有一个缺点,设置了这种缩放方式之后,表头就不能再被拉伸完全失去响应。

方法二:
注意到QTableView类还有一个成员方法:setColumnWidth(),显然是用来设置表格列宽的。但是,这里有个要求。所有对setColumnWidth()的调用都要放在setModel()之后。如果在设置View类的Model之前就调用该方法来设置列宽,是不会起作用的。代码:

m_viewList =  new  QTableView( this );
m_viewList->setSelectionBehavior(QAbstractItemView::SelectRows);
m_viewList->setSelectionMode(QAbstractItemView::SingleSelection);
m_viewList->setSortingEnabled( false );
m_viewList->verticalHeader()->hide();
m_viewList->setWordWrap( false );
m_viewList->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
m_viewList->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_viewList->setShowGrid( false );
m_viewList->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_viewList->horizontalHeader()->setHighlightSections( false );
m_viewList->setItemDelegate( new  NoFocusDelegate());
m_viewList->setModel(m_proxyModel);
m_viewList->setAlternatingRowColors( true );   // alternative colors
m_viewList->setFrameShape(QFrame::NoFrame);
 
// column width
m_viewList->setColumnWidth(0, 85);
m_viewList->setColumnWidth(1, 180);
m_viewList->setColumnWidth(2, 90);
m_viewList->setColumnWidth(3, 80);
m_viewList->setColumnWidth(4, 80);
m_viewList->setColumnWidth(5, 30);
m_viewList->setColumnWidth(6, 40);
m_viewList->setColumnWidth(7, 120);
m_viewList->setColumnWidth(8, 120);
m_viewList->setColumnWidth(9, 120);

在这里插入图片描述

2.32 QTableView、QTableWidget设置默认行高和列宽

  • 可以设置tableview所有列的默认行高为15。
QTtableView或者QTableWidget的verticalHeader()->setDefaultSectionSize(15) 
  • 可以设置tableview所有行的默认列宽为15。
QTtableView或者QTableWidget的horizontalHeader()->setDefaultSectionSize(15)

2.33 tableWidget单选或多选

tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);  //设置为可以选中多个目标
 
 (参数含义:QAbstractItemView.NoSelection--不能选择
 
             QAbstractItemView.SingleSelection--选中单个目标
 
             QAbstractItemView.MultiSelection--选中多个目标
 
  QAbstractItemView.ExtendedSelection/QAbstractItemView.ContiguousSelection 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选)

2.34 (TableView)中设置为不可编辑状态

    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

2.35 qt 中的 setsourcemodel 方法

  • 在 Qt 中,setSourceModel 方法是用于设置模型的源模型,也就是将一个模型设置为另一个模型的源模型。这个方法可以用于控制模
    型之间的数据流,实现数据的过滤、排序、分组等操作。

使用 setSourceModel 方法时,需要注意以下几点:

  1. setSourceModel 方法只能应用于继承自 QAbstractItemModel的模型类中。
  2. setSourceModel方法应该在视图之前被调用,因为视图会将模型设置为其自身的模型。
  3. 一个模型只能有一个源模型,如果需要在一个模型中使用多个源模型,则需要使用 QSortFilterProxyModel 等代理模型来实现。
  4. setSourceModel方法不会改变模型中的数据,而是只改变模型的行数、列数、索引和数据的顺序等属性。
  5. 当源模型中的数据发生改变时,会自动发送信号通知视图和代理模型进行更新操作。
  • 总之,setSourceModel 方法是 Qt 中非常重要的一个方法,可以实现一些非常有用的功能,例如数据的过滤、排序、分组等操作,值得开发者们深入学习和应用。

3 信号事件

3.1 常用信号

信号说明
void itemEntered(QTableWidgetItem *item);鼠标移上去 要打开鼠标跟踪事件(setMouseTracking(true)),自定义widget无效,如果是空的item,不会触发此信号
void itemChanged(QTableWidgetItem *item);单元格发生改变
void cellEntered(int row, int column);鼠标移上去 要打开鼠标跟踪事件(setMouseTracking(true)),如果是空的item,会触发此信号
void cellChanged(int row, int column);单元格发生改变
void cellClicked(int row, int column);鼠标单击事件,空行也可触发,只能鼠标左键点击
void cellDoubleClicked(int row, int column);鼠标双击事件,空行也可触发,鼠标左键或右键双击
void itemClicked(QTableWidgetItem *item);鼠标单击事件,空行不会触发,只能鼠标左键点击
void itemDoubleClicked(QTableWidgetItem *item);鼠标双击事件,空行不会触发,鼠标左键或右键双击
还有很多常用的信号,就不全都列举出来了,可自行查询Qt源码。。。

3.2 标题栏点击信号

connect(ui.tableWidget->horizontalHeader(), &QHeaderView::sectionClicked, [=](int col) {
	qDebug() << col  << " : " << ui.tableWidget->horizontalHeaderItem(col)->text()<< endl;
});
  • 获取水平或垂直方向上的表头以后,可以查看里面的很多信号,通过相关信号可以设置点击表头排序,或设置表头字体加粗等属性。相关属性自行查询Qt源码即可。

4 样式设置

QHeaderView                    // QTableWidget 标题头整个区域
{
    background:transparent;        // 整个标题头区域背景色
}
QHeaderView::section           // 标题头 每个单独的标题区域
{
    font-size:14px;                // 每个标题的字体大小
    font-family:"Microsoft YaHei"; // 每个标题的字体类型
    color:#FFFFFF;                 // 每个标题的字体颜色
 
    background:#60669B;            // 每个标题区域的背景色
    border:none;                   // 每个标题区域的边框
    text-align:left;               // 每个标题的对齐方式(貌似不能用)。建议使用tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter)
 
    min-height:49px;               // 标题区域的高度
    max-height:49px;               //
 
    margin-left:0px;               // 每个标题区域的margin
    padding-left:0px;              // 每个标题区域的padding
}
QHeaderView::section:checked           // 标题头 选中的状态
{}
QTableWidget                   // 整个表格控件
{
    background:#FFFFFF;            // 整个表格控件 背景色
    border:none;                   // 整个表格控件 边框
 	gridline-color: $border;    /*表格中的网格线条颜色*/
    /*设置交替颜色,需要在函数属性中设置:tableWidget->setAlternatingRowColors(true)*/
    alternate-background-color: $grad1a;
    /*selection-color:$background;    鼠标选中时前景色:文字颜色*/
    selection-background-color:$selected;   /*鼠标选中时背景色*/
    border:1px solid $border;  /*边框线的宽度、颜色*/
    /*border:none;    去除边界线*/
    /*border-radius:5px;*/
    /*padding:10px 10px;*/  /*表格与边框的间距*/
    font-size:12px;                // 所有字体大小
    font-family:"Microsoft YaHei"; // 所有字体 family
    color:#666666;                 // 所有字体颜色
}
 
QTableWidget::item                // 每个单元格
{
    border-bottom:1px solid #EEF1F7 ; // 只显示每个单元格下边框
}
 
QTableWidget::item::selected      // 每个单元格被选中状态
{
    color:red;                        // 每个单元格被选中时 字体颜色
    background:#EFF4FF;               // 每个单元格被选中时 背景颜色
}
 
QScrollBar::handle:vertical        // 垂直滚动条 handle
{
    background: rgba(255,255,255,20%); // 垂直滚动条 handle 的背景色
    border: 0px solid grey;            // 垂直滚动条 handle 边框
    border-radius:3px;                 // 垂直滚动条 handle 圆角
    width: 8px;                        // 垂直滚动条 handle 宽度
}
QScrollBar::vertical                    // 垂直滚动条 区域
{
    border-width:1px;                       // 垂直滚动条 区域 边框宽度
    border-style: solid;                    // 垂直滚动条 区域 边框类型
    border-color: rgba(255, 255, 255, 10%); // 垂直滚动条 区域 边框颜色
    width: 8px;                             // 垂直滚动条 区域 宽度
    margin:0px 0px 0px 0px;                 // 垂直滚动条 区域 margin
    border-radius:3px;                      // 垂直滚动条 区域 圆角
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical // 垂直滚动条  handle上、下区域(未被handle占用的区域)
{
    background:rgba(255,255,255,10%);                            // 垂直滚动条 handle上、下区域的背景色
}
QScollBar::add-line:vertical, QScrollBar::sub-line:vertical  // 垂直滚动条 最顶端与最低端的区域
{
    background:transparent;                                      // 垂直滚动条 最顶端与最低端区域的背景色
}

设置单元格高度:
tableWidget->verticalHeader()->setDefaultSectionSize()
2.设置标题对齐方式

tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
3.设置选择单元格 不出现虚线框(虚框)

tableWidget->setFocusPolicy(Qt::NoFocus);

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值