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

news2024/11/28 22:54:19

QTableWidget及基本操作

  • 1. 概述
  • 2. 主要操作函数
    • 2.1 QTableWidgets实例化
    • 2.2 设置表头 setHorizontalHeaderLabels
    • 2.3 单元格选择:setSelectionBehavior
    • 2.4 设置列数 setColumnCount
    • 2.5 设置行数 setRowCount
    • 2.6 网格的显示 setShowGrid
    • 2.7 添加表项 setItem
    • 2.8 表项添加自定义控件 setCellWidget
    • 2.9 单元格操作 setTextAlignment
    • 2.10 单元格大小设定 setColumnWidth setRowHeight
    • 2.11 动态插入行列 insertRow
    • 2.12 动态移除行列removeColumn removeRow
    • 2.13 其他操作 clear setSpan
    • 2.14 选择模式 setSelectionMode
    • 2.15 设置表格内容是否可编辑 setEditTriggers
    • 2.16 间隔行底色 setAltematingRowColors
    • 2.17 QTableWidgetItem::setFlags介绍:
    • 2.18 焦点事件 setFocusPolicy
    • 2.19 是否显示网格 setFocusPolicy
    • 2.20 表头高度 setMinimumHeight
    • 2.21 清空单元格里面的内容 clear
    • 2.22 清空所有标题和内容 setColumnCount(0) setRowCount(0)
    • 2.23 设置指定宽度
    • 2.24 插入数据
    • 2.25 插入QIcont图片
    • 2.26 设置/获取行高
    • 2.27 设置图标尺寸
    • 2.28 插入widget图片
    • 2.29 删除一行或多行
    • 2.30 获取水平或垂直方向上的表头
    • 2.31 表象单独存储用户数据
    • 2.31 indexAt函数 返回QModelIndex
  • 3 信号事件
    • 3.1 常用信号
    • 3.2 标题栏点击信号
  • 4 样式设置

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表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见的锁和zookeeper

zookeeper 本文由 简悦 SimpRead 转码&#xff0c; 原文地址 zhuanlan.zhihu.com 前言 只有光头才能变强。 文本已收录至我的 GitHub 仓库&#xff0c;欢迎 Star&#xff1a;https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列&#xff1f;以后&#xff0c;本来…

Ubuntu 20.04.5 LTS x86_64 Docker stable diffusion webui 及 http api接口

资源 Docker镜像 docker pull darkroot1234/ayanami:latest 参考地址&#xff1a; docker一键运行stable diffusion webui&#xff0c;常用插件和功能完备&#xff0c;获得镜像后可打包带走 - 哔哩哔哩 nvidia cuda 驱动 https://us.download.nvidia.cn/XFree86/aarch64/…

Django框架005:阶段性`实战小案例`“答辩“公司员工表

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

基于 DDR3 的串口传图帧缓存系统设计实现(整体设计)

文章目录 前言一、串口传图顶层系统设计框图二、各模块说明三、系统工程及 IP 创建四、uart_ddr3_tft模块五、uart_ddr3_tft模块仿真文件六、uart_ddr3_tft模块仿真文件 前言 结合串口接收模块和 tft 显示屏控制模块&#xff0c;设计一个基于 DDR3 的串口传图帧缓存系统。 提示…

DES加密算法、RSA加密算法

DES加密算法 DES加密过程 1、将明文和密钥转化为ASCII码&#xff0c;明文64位bit&#xff0c;密钥56位 2、明文进行初始置换 3、明文初始置换后前32位为L0&#xff0c;后32位为R0 4、第一轮算法&#xff0c;L1R0&#xff0c;R0进行F运算后跟L0异或的结果为R1 5、F运算&#x…

jmeter如何测试一个get请求

目录 1.配置测试计划1.1.创建线程组1.2.创建GET的HTTP请求取样器&#xff08;模拟GET请求&#xff09;1.3.添加查看结果树和聚合报告 2.执行压测并查看结果2.1.验证接口2.2.执行压力测试 使用jmeter测试一个http的get请求示例. 1.配置测试计划 1.1.创建线程组 打开jmeter - 测…

C语言实现扫雷(包含递归展开)

目录 一&#xff1a;扫雷游戏的基础逻辑 二&#xff1a;关于扫雷相关的信息存储 三&#xff1a;游戏大体实现逻辑 四&#xff1a;具体实现 (1)初始化 (2)打印 (3)布置雷 (4)查雷 五&#xff1a;全部代码 (1)game.h (2)game.c (3)test.c 六&#xff1a;实际效果演示…

【操作系统复习】第6章 虚拟存储器 2

请求分页中的内存分配 在为进程分配物理块时&#xff0c;要解决下列的三个问题&#xff1a; 1. 保证进程可正常运行所需要的最少物理块数 2. 每个进程的物理块数&#xff0c;是固定值还是可变值&#xff08;分配策略&#xff09; 3. 不同进程所分配的物理块数&#xff…

Python基础入门编程代码练习(三)

一、猜数游戏 有一个数列&#xff1a;8&#xff0c;4&#xff0c;2&#xff0c;1&#xff0c;23&#xff0c;344&#xff0c;12循环输出数列的值求数列中所有数值的和猜数游戏&#xff1a;从键盘中任意输入一个数据&#xff0c;判断数列中是否包含此数 实现代码如下&#xf…

【云原生】Kubrenetes二进制--单节点Master集群

单节点Master集群 一、Kubernetes概述1、Master组件2、Node组件 二、Kubernetes核心概念1、Pod概述2、Pod控制器3、Label标签4、Label选择器5、Service6、Ingress 三、部署kubernetes1、所有节点关闭防火墙 核心防护 Swap交换2、将三台服务器的地址hosts中3、调整内核参数4、时…

十分钟教你搭建ChatGPT 图片生成的安卓应用

十分钟教你搭建ChatGPT 图片生成的安卓应用 大家好&#xff0c;我是易安&#xff01; 今天&#xff0c;我们将集成 OpenAI API (ChatGPT)来构建一个简单的类似 ChatGPT 的 android 应用程序&#xff0c;让它返回我们想要的图片&#xff0c;本文是上一篇的姊妹篇。 详细步骤 第…

防止表单重复提交的几种方式,演示一个自定义注解方式的实现

防止表单重复提交的几种方式&#xff0c;演示一个自定义注解方式的实现 一、防止表单重复提交的几种方式方式一&#xff1a;Token 机制方式二&#xff1a;去重表&#xff08;主要是利用 MySQL 的唯一索引机制来实现的&#xff09;方式三&#xff1a;Redis 的 setnx方式四&#…

数组(C语言版)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…

3 ES快速入门

3 ES快速入门 ES作为一个索引及搜索服务&#xff0c;对外提供丰富的REST接口&#xff0c;快速入门部分的实例使用head插件来测试&#xff0c;目的是对ES 的使用方法及流程有个初步的认识。 3.1 创建索引库 ES的索引库是一个逻辑概念&#xff0c;它包括了分词列表及文档列表…

电力系统负荷与电价预测优化模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C++】vector的模拟实现及深度剖析

目录 一、模拟实现二、使用memcpy拷贝问题三、动态二维数组理解 一、模拟实现 namespace hxj {template<class T>class vector{public:// Vector的迭代器是一个原生指针typedef T* iterator;typedef const T* const_iterator;//构造和销毁vector():_start(nullptr), _fi…

Spring更简单的存储和读取Bean对象

目录 1.第一个Spring项目 2.存储Bean对象 2.1 准备工作 2.2 五大类注解 2.3 方法注解Bean 2.4 Bean对象的默认命名规则 3. 读取Bean对象 3.1 属性注入 3.2 setter注入 3.3 构造方法注入 3.4 注入异常问题 3.5 注入方式优缺点 3.6 Autowired和Resource的区别 1.第一…

python web开发(二):HTML标签语言

文章目录 简介标签语法标题div和span超链接插入图片列表表格Input系列提交表单 参考 简介 如下展示了一段简单的HTML模板&#xff0c; <head></head>标签中主要包含一些基本配置&#xff0c;如编码方式&#xff0c;标题等&#xff0c;注意标题的作用如下图所示 …

【java BUG收集-持续更~】

JAVA BUG JAVA BUGliquibase.lockservice锁异常1、启动参数增加jvm参数 -Dliquibase.lockservicefalse2、修改或清空 包含有 DATABASECHANGELOGLOCK的表 JAVA BUG 该章收集工作中遇到的java bug,作为工作日志&#xff0c;方便回顾。 liquibase.lockservice锁异常 报错信息&a…

Spring Boot实用技巧之单元测试

文章目录 一、单元测试的概念二、单元测试的优势三、Spring Boot实现单元测试&#xff08;一&#xff09;添加依赖&#xff08;二&#xff09;生成单元测试的类&#xff08;三&#xff09; 添加注解和业务代码1. 添加 SpringBootTest 注解2. 添加单元测试的业务代码3. 执行测试…