QTableWidget高级使用总结

常用设置/接口/API

//使行列头自适应宽度,最后一列将会填充空白部分,也可以实现充满窗体

table->horizontalHeader()->setStretchLastSection(true);

//使行列头自适应宽度,所有列平均分来填充空白部分

table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

//使行自适应高度,假如行很多的话,行的高度不会一直减小,当达到一定值时会自动生成一个QScrollBar

table->verticalHeader()->setResizeMode(QHeaderView::Strtch);

//设置单击选择一行

table->setSelectionBehavior(QAbstractItemView::SelectRows);

//设置表格内容不可编辑

table->setEditTriggers(QAbstractItemView::NoEditTriggers);

//设置某一列或某一行不可编辑,需要使用每个item不能编辑的来设置。不能设置表格内容不可编辑

item = new QTableWidgetItem(str);

item->setFlags(item->flags() & (~Qt::ItemIsEditable));

//设置只能选择一行,不能选择多行

table->setSelectionMode(QAbstractItemView::SingleSelection);

/去掉每行的行号,左侧自增行号/

QHeaderView *headerView = table->verticalHeader();

headerView->setHidden(true);

/设置让某个单元格或某行选中/

选中单元格:table->setCurrentCell(row, column, QItemSelectionModel::Select);

选中一行:table->setCurrentCell(row, QItemSelectionModel::Select);(注意此处的列没有值)

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

//设置每行内容不可更改

ui->friendList->setAlternatingRowColors(true);

//设置隔一行变一颜色,即:一灰一白

setAlternatingRowColors(true);//任意单击都选中一行setSelectionBehavior(QAbstractItemView::SelectRows);

//设置要选中高亮的行,这里会触发QTableWidget::itemClicked的信号

tableWidget->selectRow(row);

//取消高亮效果:

table->clearSelection()

//类似的API:setSelection()\selectAll()

//取消表头选中时候,高亮

->horizontalHeader()->setHighlightSections(false);

//内容居中, 设置具体单元格中字体

table->item(i,j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);

table->item(1, 0)->setBackgroundColor(QColor(0,60,10));   //背景颜色

table->item(1, 0)->setTextColor(QColor(200,111,100));       //字体颜色

table->item(1, 0)->setFont(QFont(“Helvetica”));                  //字体风格

//显示图标:

tableWdiget->setItem(0,1,newQTableWidgetItem(QIcon(":/image/cpu"),“cpu”));

设置图标的大小:setIconSize()

//默认行高 默认列宽

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

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

//根据不同的列设置不同的效果

ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);

ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);

ui->tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents);

QTableWidget****控件属性

1)禁止编辑表格

在默认情况下,表格里的字符是可以更改的。

比如双击一个单元格,就可以修改原来的内容,如果想禁止用户的这种操作,让这个表格对用户只读,可以这样:

table->setEditTriggers(QAbstractItemView::NoEditTriggers);

2)设置表格为选择整行

/设置表格为整行选中/

table->setSelectionBehavior(QAbstractItemView::SelectRows);

3)设置单个选中和多个选中

单个选中意味着每次只可以选中一个单元格,多个就是相当于可以选择”一片“那种模式。

/设置允许多个选中/

ui.qtablewidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

4)表格表头的显示与隐藏

对于水平或垂直方向的表头,如果不想显示可以用以下方式进行(隐藏/显示)设置:

ui.qtablewidget->verticalHeader()->setVisible(true);

ui.qtablewidget->horizontalHeader()->setVisible(false);

5)设置具体单元格中字体的对齐方式

ui.qtablewidget->item(0, 0)->setTextAlignment(Qt::AlignHCenter);

6)设置具体单元格中字体格式

ui.qtablewidget->item(1, 0)->setBackgroundColor(QColor(0,60,10));

ui.qtablewidget->item(1, 0)->setTextColor(QColor(200,111,100));

ui.qtablewidget->item(1, 0)->setFont(QFont(“Helvetica”));

7)设置具体单元格的值

ui.qtablewidget->setItem(1, 0, new QTableWidgetItem(str));

8)把QTableWidgetItem对象内容转换为****QString

QString str =table->item(0, 0)->data(Qt::DisplayRole).toString();

9)具体单元格中添加控件

QComboBox *comBox = new QComboBox();

comBox->addItem(“F”);

comBox->addItem(“M”);

ui.qtablewidget->setCellWidget(0,3,comBox);

10)合并单元格

//合并单元格的效果

ui.qtablewidget->setSpan(2, 2, 3, 2);

//第一个参数:要改变的单元格行数

//第二个参数:要改变的单元格列数

//第三个参数:需要合并的行数

//第四个参数:需要合并的列数

11)具体单元格中插入图片

ui.qtablewidget->setItem(3, 2, new QTableWidgetItem(QIcon(“images/music.png”), “Music”));

12)设置显示网格

ui.qtablewidget->setShowGrid(true);//显示表格线

setShowGrid(false); //去除表格线、分割线。

13)设置滚动条

ui.qtablewidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水平滚动条

14)设置列标签

//初始化界面

QStringList HStrList;

HStrList.push_back(QString(“name”));

HStrList.push_back(QString(“id”));

HStrList.push_back(QString(“age”));

HStrList.push_back(QString(“sex”));

HStrList.push_back(QString(“department”));

//设置行列数(只有列存在的前提下,才可以设置列标签)

int HlableCnt = HStrList.count();

ui.qtablewidget->setRowCount(10);

ui.qtablewidget->setColumnCount(HlableCnt);

//设置列标签,表头

ui.qtablewidget->setHorizontalHeaderLabels(HStrList);

16)设置行和列的大小设为与内容相匹配

ui.qtablewidget->resizeColumnsToContents();

ui.qtablewidget->resizeRowsToContents();

17)设置字体

ui.qtablewidget->setFont(font); //设置字体

18)获取某一单元格的内容

QString strText = ui.qtablewidget->item(0, 0)->text();

19)清空表格的内容

void QTableWidget::clear () [slot]//清空掉表格内所有内容,包括标题头

void QTableWidget::clearContents () [slot]//这个清空所有内容不包括标题头

void QTableWidget::removeColumn ( int column ) [slot]//这个是删除一列,而不是清空表格

void QTableWidget::removeRow ( int row ) [slot]//这个是删除一行,不是清空一行

20)去除分割线:

setShowGrid(false);

QTableWidget的用法总结****

检索tablewidget的内容

//获取符合条件的cell索引
//Qt::MatchContains 会匹配出只要包含text的item的模糊匹配
//Qt::MatchRegExp 只包含text的item 完全匹配。
QList <QTableWidgetItem *> item = source->findItems(text,  Qt::MatchContains);   
for (int i = 0; i  < rC; i++)
{
  source->setRowHidden(i,  true);//隐藏所有行
}
if  (!item.isEmpty())//不为空
{
  for (int i = 0; i  < item.count(); i++)
  {
    source->setRowHidden(item.at(i)->row(),false);//item.at(i).row()输出行号
  }
}

item背景色

* item->setBackgroundColor(QColor(255,0,0));
* item->setBackground(QBrush(QColor(255, 0, 0)));

右键菜单

Constant
Qt::NoContextMenu小部件没有上下文菜单,上下文菜单处理被延迟到小部件的父组件。
Qt::PreventContextMenu小部件没有上下文菜单,而且与NoContextMenu相反,处理不会延迟到小部件的父级。这意味着所有鼠标右键事件都保证通过QWidget::mousePressEvent()和QWidget::mouseReleaseEvent()传递到小部件本身。
Qt::DefaultContextMenu调用小部件的QWidget::contextMenuEvent()处理程序。
Qt::ActionsContextMenu小部件将其QWidget::actions()显示为上下文菜单。
Qt::CustomContextMenu小部件发出QWidget:: customcontextmenurequired()信号。
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(show_contextMenu(QPoint)));
void Dg_Setting_Long::show_contextMenu(QPoint pos)//pos 是在table内的相对位置
{
    Q_UNUSED(pos);
    if(cmenu)//保证同时只存在一个menu,及时释放内存
    {
        delete cmenu;
        cmenu = nullptr;
    }
QTableWidget *table = qobject_cast<QTableWidget*>(sender());
    cmenu = new QMenu(table);
 
    QAction* modColAction = cmenu->addAction("修改该行");
    QAction* delColAction = cmenu->addAction("删除该行");
    QAction* addColAction = cmenu->addAction("增加一行");
 
    connect(modColAction, SIGNAL(triggered(bool)), this, SLOT(action_mod()));
    connect(delColAction, SIGNAL(triggered(bool)), this, SLOT(action_del()));
    connect(addColAction, SIGNAL(triggered(bool)), this, SLOT(action_add()));
 
    cmenu->exec(QCursor::pos());//在当前鼠标位置显示
    //cmenu->exec(pos)是在viewport显示
} 

Qtablewidget表头的排序指示器:

table->horizontalHeader()->setSortIndicator(col,Qt::AscendingOrder);

  • 在ui文件中table属性Header

表头可见/不可见

  • ui->tableWidget->horizontalHeader()->setVisible(true);

样式设置

添加复选框:改变选中和非选中的Icon。

->setStyleSheet()

QTableWidget::indicator  {
    width:  40px;
    height:  40px;
}
QTableWidget::indicator:unchecked  {
    image:  url(:/icon/unchecked.png);
}
QTableWidget::indicator:checked  {
    image:  url(:/icon/checked.png);
}

qss表头和滚动条属性:

//表示表头没有设置区域
QHeaderView{
font:14pt;
}
//v表示设置了表头的区域
QHeaderView::section  {
background-color:lightgray;color:  black;
padding-left:  4px;border: 1px solid #6c6c6c;
font:14pt '宋体';
}
QTableWidget  QHeaderView::section {
background-color:  rgb(210, 210, 210);color: black;
padding-left:  4px;border: 1px solid white;
font: 12pt  "微软雅黑";
height:40px;
}
 
/*table 滚动条*/
QScrollBar{
height:30px;
width:30px;
background-color:rgb(93,172,228);
}
//会把两端箭头消失
QScrollBar::handle{
background-color:  rgb(255, 0, 127);
}
QScrollBar::add-line:vertical  
QScrollBar::sub-line:vertical  

设置表头字体和背景

ui.tableWidget_grid->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(40,143,218);font:13pt  '宋体';color: white;};");

selection-background-color选中的背景色

QTableWidget 如何让左上角的方块不可点击

QTableWidget如何让左上角的方块不可点击

用Designer,在QTableView里面有一个cornerBottonEnabled,将其勾去掉。

用代码编写

setCornerButtonEnabled(true);

QTableWidget让Item不可编辑

将QAbstractItemView下的selectionMode改为NoSelection。

QTableWidget让Header不可点击

horizontalHeader()->setSectionsClickable(false);    //水平方向的头不可点击

verticalHeader()->setSectionsClickable(false);      //垂直方向的头不可点击

QTableView表格左上角样式

图片

QScrollBar::handle:vertical  
{ 
background-color:  rgb(210, 210, 210);
}
QScrollBar:vertical{
width:22px;
background-color:rgb(214,214,214);
margin:30px  0px 30px 0px;
}
 
QScrollBar::add-page:vertical,  QScrollBar::sub-page:vertical
{
background-color:  rgb(255, 255, 255);
}
QScrollBar::up-arrow:vertical{
width:22px;
border-image:  url(:/images/FuncWidget/sarrowup.png);
}
QScrollBar::sub-line:vertical{
border:none;
subcontrol-origin:  margin;
height: 30px;
}
QScrollBar::add-line:vertical{
subcontrol-origin:  margin;
height:  30px;
border:none;
}
QScrollBar::down-arrow:vertical{
width:22px;
border-image:  url(:/images/FuncWidget/sarrowdown.png);
}
//红色部分为必须的
 
 
//表头支持箭头,样式
QHeaderView::up-arrow {}
QHeaderView::down-arrow {}

QListWidget与QTableWidget的使用以及样式设置

  • margin:10px 5px 15px 20px;上外边距是 10px
  • 右外边距是 5px
  • 下外边距是 15px
  • 左外边距是 20px

说明

这个简写属性设置一个元素所有外边距的宽度,或者设置各边上外边距的宽度。

块级元素的垂直相邻外边距会合并,而行内元素实际上不占上下外边距。行内元素的的左右外边距不会合并。同样地,浮动元素的外边距也不会合并。允许指定负的外边距值,不过使用时要小心。

某一列内容自适应:

QTableWidget要调整表格行宽主要涉及以下一个函数

1.resizeColumnsToContents();

根据内容调整列宽

2.resizeColumnToContents(int col);

根据内容自动调整给定列宽

3.horizontalHeader()->setResizeMode

把给定列设置为给定模式

主要模式有Stretch和Fixed

qt designer中的设置

在UI设计界面中选中该控件之后可以在属性栏对控件的属性进行设置,最常用的属性有如下:

focusPolicy 焦点策略,如果设置为NoFocus可以去掉单击时候现实的单元格的虚线框

contextMenuPolicy 可以设置右键菜单

frameShape 设置外边框,一般设置为NoFrame去掉边框

editTriggers触发单元格的编辑状态,值NoEditTriggers表示不触发编辑状态

selectionMode选择模式,值ExtendedSelection表示多选

selectionBehavior选择行为,值SelectRows按行选择

showGrid是否显示网格线

rowCount行数

columnCount列数

horizontalHeaderVisible是否显示水平表头

verticalHeaderVIsible是否显示垂直表头

verticalScrollBarPolicy设置垂直滚动条策略

horizontalScrollBarPolicy设置水平滚动条策略

问题:对于水平的滚动条,可能会遇到左边的按钮没有显示的问题

QScrollBar:horizontal {
  height:22px;
  background-color:rgb(214,214,214);
  margin:0px 30px 0px 30px;
}
QScrollBar::handle:horizontal 
{ 
  background-color: rgb(210, 210, 210);
}
 
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal
{
  background-color: rgb(255, 255, 255);
}
 
QScrollBar::left-arrow:horizontal{
  height:22px;
  width: 30px;
  border-image: url(:/images/FuncWidget/sarrowleft.png);
 
}
QScrollBar::sub-line:horizontal{
  border:none;
 
}
QScrollBar::right-arrow:horizontal{
  height:22px;
  border-image: url(:/images/FuncWidget/sarrowright.png);
}
 
QScrollBar::add-line:horizontal{
  subcontrol-origin: margin;
  width:30px;
  border:none;
}

QtableWidget****的使用

在item上添加控件:setCellWidget()

* 示例代码:位置可以通过添加widget,再添加布局来实现。
//按钮
++nSubItem;
QPushButton *bt = new QPushButton(tr("添加"));
bt->setObjectName(tr("bt_info_add"));
bt->setMinimumSize(145, 35);
bt->setMaximumSize(145, 35);
connect(bt, SIGNAL(clicked()), this, SLOT(bt_Click()));
QWidget *widget = new QWidget;
QHBoxLayout *hLayout;
hLayout = new QHBoxLayout();
//调用了addWidget 之后,窗体之间存在父子关系
hLayout->addWidget(bt);
hLayout->setMargin(0);
hLayout->setAlignment(widget, Qt::AlignCenter);
hLayout->setContentsMargins(10, 0, 10, 0);
widget->setLayout(hLayout);
ui->tableWidget->setCellWidget(row, nSubItem, widget);

在button的slot函数中,从sender得到button指针,根据这个button的位置(x,y),由tablewidget->itemAt(x,y)可得到modelindex,其中itemAt不受scroll影响.

用这个方法的好处是,从modelindex开始,能完全操作tablewidget.

QPushButton *bt = qobject_cast<QPushButton* >(sender());
QWidget *obj = qobject_cast<QWidget *>(bt->parent());
int x = obj->frameGeometry().x();//obj为你QPushButton
int y = obj->frameGeometry().y();
QModelIndex index = ui->tableWidget->indexAt(QPoint(x,y));
int row = index.row();
int column = index.column();

部分控件只有点击才能出现的功能,委托、代理;可以控制用户的输入。

接口:

void QAbstractItemView::setItemDelegate(QAbstractItemDelegate*delegate)

void QAbstractItemView::setItemDelegateForColumn(intcolumn,QAbstractItemDelegate*delegate)

void QAbstractItemView::setItemDelegateForRow(introw,QAbstractItemDelegate*delegate)

网址:https://www.devbean.net/2013/03/qt-study-road-2-view-delegate/

示例代码:下拉框的实现;

//参考值是否包含最大、最小值委托
/***
• createEditor():返回一个组件。该组件会被作为用户编辑数据时所使用的编辑器,从模型中接受数据,返回用户修改的数据。
• setEditorData():提供上述组件在显示时所需要的默认值。
• updateEditorGeometry():确保上述组件作为编辑器时能够完整地显示出来。
• setModelData():返回给模型用户修改过的数据。
**/
 
class RefValEqualDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    RefValEqualDelegate(QObject* parent = nullptr);
 
    ~RefValEqualDelegate();
 
    void paint(QPainter *painter, const QStyleOptionViewItem    &option,const QModelIndex &index) const;
 
    QSize sizeHint(const QStyleOptionViewItem    &option, const QModelIndex &index) const;
 
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem    &option, const QModelIndex &index) const;
 
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
 
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};
 
#include "refvalequaldelegate.h"
#include <QComboBox>
#include "reportrangedlg.h"
# pragma execution_character_set("utf-8")
 
void RefValEqualDelegate::paint(QPainter *painter, const QStyleOptionViewItem    &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);
}
 
QSize RefValEqualDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    return QStyledItemDelegate::sizeHint(option, index);
}
 
QWidget *RefValEqualDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem    &option, const QModelIndex &index) const
{
    if(index.isValid() &&
            (static_cast<int>(reference_column_index::REF_MIN_INCLUDED) == index.column() ||
            static_cast<int>(reference_column_index::REF_MAX_INCLUDED) == index.column()))
    {
        QComboBox* inputCombo = new QComboBox(parent);
        inputCombo->addItem(QObject::tr("是"));
        inputCombo->addItem(QObject::tr("否"));
 
        inputCombo->installEventFilter(const_cast<RefValEqualDelegate*>(this));
        return inputCombo;
    }
    else
    {
        return QStyledItemDelegate::createEditor(parent, option, index);
    }
}
 
void RefValEqualDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if(index.isValid() &&
       (static_cast<int>(reference_column_index::REF_MAX_INCLUDED) == index.column() ||
        static_cast<int>(reference_column_index::REF_MIN_INCLUDED) == index.column()))
    {
        QString value = index.model()->data(index, Qt::DisplayRole).toString();
        QComboBox* inputCombo = qobject_cast<QComboBox*>(editor);
        if(!value.isEmpty())
        {
            inputCombo->setCurrentText(value);
        }
    }
    else
    {
        QStyledItemDelegate::setEditorData(editor, index);
    }
}
 
void RefValEqualDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    if(index.isValid() &&
            (static_cast<int>(reference_column_index::REF_MAX_INCLUDED) == index.column() ||
             static_cast<int>(reference_column_index::REF_MIN_INCLUDED) == index.column()))
    {
        QComboBox* inputCombo = qobject_cast<QComboBox*>(editor);
        model->setData(index, inputCombo->currentText());
    }
    else
    {
        QStyledItemDelegate::setModelData(editor, model, index);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值