QTableWidget高级使用总结

您所在的位置:网站首页 qtablewidget设置网格颜色 QTableWidget高级使用总结

QTableWidget高级使用总结

2023-12-12 14:17| 来源: 网络整理| 查看: 265

常用设置/接口/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 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))); 右键菜单 ConstantQt::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(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(sender()); QWidget *obj = qobject_cast(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 #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(reference_column_index::REF_MIN_INCLUDED) == index.column() ||             static_cast(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(this));         return inputCombo;     }     else     {         return QStyledItemDelegate::createEditor(parent, option, index);     } }   void RefValEqualDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {     if(index.isValid() &&        (static_cast(reference_column_index::REF_MAX_INCLUDED) == index.column() ||         static_cast(reference_column_index::REF_MIN_INCLUDED) == index.column()))     {         QString value = index.model()->data(index, Qt::DisplayRole).toString();         QComboBox* inputCombo = qobject_cast(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(reference_column_index::REF_MAX_INCLUDED) == index.column() ||              static_cast(reference_column_index::REF_MIN_INCLUDED) == index.column()))     {         QComboBox* inputCombo = qobject_cast(editor);         model->setData(index, inputCombo->currentText());     }     else     {         QStyledItemDelegate::setModelData(editor, model, index);     } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3