QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

2023-10-29

目录

一、 创建行表头

二、往表格里插入单元项(带图片和不带图片)

三、 禁止表格可编辑 

四、 按行或列或单个选择单元项

五 、设置列宽(包括列表头的和行表头的) 

1 这个普通的行和列都可以设置固定宽高

2 还可以将行和列的大小设为与内容相匹配

3 不想要表头的还可以隐藏掉:

4 设置表头字体颜色

5 设置固定列宽 ​编辑

六、设置为可以选中多个目标

七、单击或双击item会触发的信号以及怎么运用

八、QTableWidget添加右键菜单的方法

在此基础上,怎么创建出多级菜单呢?

在Qmenu栏里怎么让某个action在做某个操作之后才可选择

QMenu里的QAction怎么添加图标表示可选状态呢

九、QTableWidget怎么按照某列的大小来排序(有两种方法)


前言:

QTableWidget 表格单元格的行标和列标都是从 0 开始;QTableWidget 表格中,每个单元格都是 QTableWidgetItem 类的实例对象

一、 创建行表头

    QStringList cHeader;
    cHeader << "编号" << "名字" << "日期" ;
    m_tableWidget->setHorizontalHeaderLabels(cHeader);

创建之后,运行发现显示不出来表头!查找原因发现要设置了行数和列数才行:

方法1 构造的时候就创建了行数

    m_tableWidget = new QTableWidget(10,10,this);

方法2 

 m_tableWidget->setRowCount(10);
 m_tableWidget->setColumnCount(3);

二、往表格里插入单元项(带图片和不带图片)

//..1
QTableWidgetItem *item=new QTableWidgetItem();
item->setText(“示例”);
item->setBackgroundColor(QColor("#8EE5EE"));//背景颜色
item->setTextColor(QColor("#8EE5EE"));//字体颜色
item->setFont(QFont("Helvetica"));//字体样式
m_tableWidget->setItem(row,col,item);

//..2插入带图片的项目
m_tableWidget->setItem(row,col,new QTableWidgetItem(QIcon("images/found.png"), "查找"));

另:如果需要对所有的单元格都使用这种字体,则可以使用  tableWidget->setFont(QFont("Helvetica")); 

三、 禁止表格可编辑 

在默认情况下,表格里的字符是可以更改的。比如双击一个单元格,就可以修改原来的内容。

   m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
QAbstractItemView::NoEditTriggers 不允许编辑
QAbstractItemView::CurrentChanged 只要当前项发生更改,编辑就会开始
QAbstractItemView::DoubleClicked 当项目(指表格里的单元项)被双击时,编辑开始
QAbstractItemView::SelectedClicked 当单击已选择的项目时,编辑开始
QAbstractItemView::EditKeyPressed 当在项目上按下Platform编辑键时,开始编辑。
QAbstractItemView::AnyKeyPressed 当在项目上按下任何键时,编辑开始。
QAbstractItemView::AllEditTriggers 开始编辑以上所有操作

四、 按行或列或单个选择单元项

 m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    
QAbstractItemView::SelectItems 选择单个项目.
QAbstractItemView::SelectRows
QAbstractItemView::SelectColumns

五 、设置列宽(包括列表头的和行表头的) 

这个对列表头的设置有用,记得加头文件

#include <QHeaderView>不然会报错
m_tableWidget->verticalHeader()->setMinimumWidth(42);
m_tableWidget->horizontalHeader()->setMinimumHeight(30);

1 这个普通的行和列都可以设置固定宽高

m_tableWidget->setColumnWidth(1,200);
m_tableWidget->setRowHeight(1,120);

 表头的一些相关设置还可以看看这个:因为上面的能达到我的暂时要求,其他就没去时有啥效果了.

加了下面这句之后,不管你的界面是放大还是缩小,那一列的宽高都是固定在你设置的值,而且不可手动把他变大变小

m_tableWidget->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);

2 还可以将行和列的大小设为与内容相匹配

    m_tableWidget->resizeColumnsToContents();
    m_tableWidget->resizeRowsToContents();

3 不想要表头的还可以隐藏掉:

 m_tableWidget->verticalHeader()->setVisible(false);   //隐藏列表头
 m_tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头

4 设置表头字体颜色

    QTableWidgetItem *columnHeaderItem0 = m_tableWidget->horizontalHeaderItem(0); //获得水平方向表头的Item对象
    columnHeaderItem0->setFont(QFont("Helvetica")); //设置字体
    columnHeaderItem0->setBackgroundColor(QColor("#BBFFFF")); //设置单元格背景颜色
    columnHeaderItem0->setTextColor(QColor("#BBFFFF")); //设置文字颜色

Qt中设置QTableWidget的表头高度

5 设置固定列宽 

六、设置为可以选中多个目标

m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);  
  
QAbstractItemView::SingleSelection 单选
QAbstractItemView::ContiguousSelection

平时就当做单选即可;

它还有个功能就是按下shift键的时候同时选择单元项,再选择另一个单元项时,两个中间的单元项都会被选择。也就是多选

QAbstractItemView::ExtendedSelection

这个感觉和上面那个达到的效果一样,按shift键也可以多选;

还有个功能就是当用户以通常的方式选择一项时,该选择被清除并且新的项被选中。但是,如果用户在单击某个项目时按下Ctrl键,则会切换所单击的项目,而所有其他项目保持不变。(我没看懂qaq)

QAbstractItemView::MultiSelection

这个就是你连续拉,可以多选(而且你再重新选中其他项目之前的状态会保持不变,上面三个是你再次选中其他单元项的时候,之前选中的就会恢复没被选中的状态);

然后你选中了某个项目再单击一次那个项目它的状态就会被切换成没选中;上面三个都没有这个效果也就是你再单击它也是选中的状态,除非你选了其他的单选项

QAbstractItemView::NoSelection Items cannot be selected.

七、单击或双击item会触发的信号以及怎么运用

connect(m_tableWidget,SIGNAL(itemClicked(QTableWidgetItem*)),this,SLOT(slotGetTableItem(QTableWidgetItem*)));

//槽函数里面我们可以通过item获取很多单元格里的信息,比如item所在的行和列,文字等    
void MainWindow::slotGetTableItem(QTableWidgetItem *item)
{
    qDebug() << item->column() << item->text() << "ceshi";
}

另外还有这些信号,用法和上面一样 

void itemActivated ( QTableWidgetItem * item )
void itemChanged ( QTableWidgetItem * item )
void itemDoubleClicked ( QTableWidgetItem * item )
void itemEntered ( QTableWidgetItem * item )
void itemPressed ( QTableWidgetItem * item )

八、QTableWidget添加右键菜单的方法

 //..1
 QMenu   *m_popupMenu;

 //..2
 m_popupMenu=new QMenu(this);
 m_popupMenu->addAction(tr("选中"),this,SLOT(slotCheckedSelected()));//这个槽函数里面可以做你选择之后想做的事
 m_popupMenu->addAction(tr("取消选中"),this,SLOT(slotUnCheckedSelected()));
 m_popupMenu->addSeparator();

 //..3
 m_tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); 
 connect(m_tableWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(slotShowPopupMenu(QPoint)));

//槽函数
void MainWindow::slotShowPopupMenu(const QPoint &p)
{
    QPoint pp;
    pp.setX(QCursor::pos().x()+2);
    pp.setY(QCursor::pos().y());
    m_popupMenu->exec(pp);
}

 效果:

在此基础上,怎么创建出多级菜单呢?

 

 当鼠标滑到多级菜单添加的项目是会自动弹出下级菜单的,方法如下:

新创建出一个菜单:

QMenu   *m_testMenu;
    m_testMenu = m_popupMenu->addMenu("ceshi");//重点在这里
    m_testMenu->addAction(tr("111"),this,SLOT(slotTest1()));
    m_testMenu->addAction(tr("2222"),this,SLOT(slotTest2()));
    m_testMenu->addSeparator();

当然这是在QTableWidget里面我们刚才已经绑定了这个m_tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);而且槽函数里面做了相关操作,右键的时候会弹出菜单栏

如果不是在表格里面的话,我们可能需要重写contextMenuEvent()事件用于处理鼠标右键事件,在右击鼠标时,在鼠标点击的位置弹出菜单。

void Widget::contextMenuEvent(QContextMenuEvent *event)
{
    m_popupMenu->exec(QCursor::pos());
    event->accept();
}

在Qmenu栏里怎么让某个action在做某个操作之后才可选择

示例:

    QMenu *m_ProgramBtnGroupMenu;
    QAction *m_CopyEffectAction;
    m_ProgramBtnGroupMenu->addAction(tr("复制"), this, SLOT(slotProgramGroupCopy()));
    m_CopyEffectAction = m_ProgramBtnGroupMenu->addAction(tr("粘贴"), this, SLOT(slotProgramGroupPost()));
    //先设置为不可见
    m_CopyEffectAction->setEnabled(false);

    //然后再你做了某个操作之后,就设为可见
    m_CopyEffectAction->setEnabled(true);

QMenu里的QAction怎么添加图标表示可选状态呢

示例:

    QAction      *m_ascSortAction;
    QAction      *m_descSortAction;    

用setIcon的方法添加图标,直接构造添加的,我的显示不是很顺畅不知道啥原因 

这几个action都可以绑定同一个槽函数,具体如下:

void MainWindow::slotSortAction()
{
    QAction *action = (QAction*)sender();
    QString sActText = action->text();
    
    if(sActText ==  "升序")
    {
        m_bDescSortSong = false;
        m_ascSortAction->setIconVisibleInMenu(true);//设置图标可见
        m_descSortAction->setIconVisibleInMenu(false);//设置图标不可见
    }
    else if(sActText == "降序")
    {
        m_bDescSortSong = true;
        m_ascSortAction->setIconVisibleInMenu(false);
        m_descSortAction->setIconVisibleInMenu(true);
    }    
}

QTableWidget怎么按照某列的大小来排序(有两种方法)

1:应用:在这里,你可以定义一个全局变量,比如说有个combox来记录它选择要排列哪一列,还有是升序还是降序,通过调用sortByColumn就可以达到表格按照某列的值排序的效果了

    int iCol=0;
    //..1
    if(m_bSortBySongDownloadTime)//我这里只涉及到两列,所以这样判断即可,多列的话可以用多个if来判断或者switch
        iCol=2;

    //..2
    if(m_bDescSortSong)
        m_tableWidget->sortByColumn(iCol,Qt::DescendingOrder);//降
    else
        m_tableWidget->sortByColumn(iCol,Qt::AscendingOrder);//升

 但是由于QTableWidgetItem比较大小的时候用的是字符串比较,我们一般比较大小的时候都是根据整型值。所以这里我们要重写一下QTableWidgetItem

.h

#ifndef MYTABLEWIDGETITEM_H
#define MYTABLEWIDGETITEM_H
#include <QIcon>
#include <QObject>
#include <QTableWidgetItem>

class MyTableWidgetItem : public QTableWidgetItem
{
public:   
    MyTableWidgetItem();
    ~MyTableWidgetItem();
    MyTableWidgetItem(const QString& sText);
    MyTableWidgetItem(int role, const QVariant & value);
    MyTableWidgetItem(const QIcon& icon, const QString& sText);
    bool operator < (const QTableWidgetItem& other) const;

};

#endif // MYTABLEWIDGETITEM_H

.cpp 

#include "mytablewidgetitem.h"

MyTableWidgetItem::MyTableWidgetItem():QTableWidgetItem()
{

}

MyTableWidgetItem::~MyTableWidgetItem()
{

}

MyTableWidgetItem::MyTableWidgetItem(const QString &sText)
{
    setText(sText);
}

MyTableWidgetItem::MyTableWidgetItem(const QIcon &icon, const QString &sText)
{
    setText(sText);
    setIcon(icon);
}

bool MyTableWidgetItem::operator <(const QTableWidgetItem &other) const
{
    //通常只需要这句话即可
     return text().toInt() < other.text().toInt();
    
    //但是由于我有一列显示的数据是QString的时间,这里就不能像上面那样直接返回了,我把时间对应的时间戳放在data数据里,比较时间戳就可以了
    bool ok;
    text().toInt(&ok);
    if(ok)
    {
        return text().toInt() < other.text().toInt();
    }
    else
    {
        return this->data(Qt::UserRole).toInt() < other.data(Qt::UserRole).toInt();
    }
}

给大家看看我加入数据的时候是怎么加的:

setData还可以存多个数据,可以看这里:利用setData(),data()存储数据的示例 

2 如果你的列数据没那么麻烦的话,可以直接用QTableWidget自带的表头排列方式,如下:

    m_tableWidget->horizontalHeader()->setClickable(true);
    m_tableWidget->horizontalHeader()->setStretchLastSection(false);
    connect(m_tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT (slotSortByColumn(int)));

    if (iColumnindex==1 || iColumnindex==3)
    {
        m_tableWidget->horizontalHeader()->setSortIndicatorShown(false);
        return;
    }

    m_iCurrentSortColumnIndex=iColumnindex;
    m_tableWidget->horizontalHeader()->setSortIndicatorShown(true);//设置是否要排列
    Qt::SortOrder cSortorder;
    cSortorder=m_tableWidget->horizontalHeader()->sortIndicatorOrder();
    m_tableWidget->sortByColumn(iColumnindex);
    cSortorder=m_tableWidget->horizontalHeader()->sortIndicatorOrder();

问题:QTableWidget的clear函数会释放Item,同样效果的还有clearContents()、removeRow()。所有再次使用到item->text()会引起异常(野指针)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法) 的相关文章

随机推荐

  • Gitee上传代码保姆级教程(亲测有效)

    作为一名程序猿or程序媛 怎么能不会使用Gitee上传代码 协同开发呢 今天 一个小白保姆级Gitee上传代码教程他来啦 亲测有效 小伙伴们来trytry吧 前提 1 已经下载过Git Bash 如果还没有下载过 请移步至其他博主的博客下载
  • 嗯嗯

    编写一个程序 可以一直接收键盘字符 如果是小写字符就输出对应的大写字符 如果接收的是大写字符 就输出对应的小写字符 如果是数字不输出 由于键盘每一个符号在c语言中是使用asscii码实现 可以使用范围来判断具体键盘输入的内容 include
  • 【Liunx】Navicat连接ubuntu下mysql

    一 首先准备好 ubuntu虚拟机一台 xftp7 mysql5 7离线包 Navicat软件 二 启动ubuntu虚拟机在主目录下创建mysql文件夹 查询虚拟机ip地址 使用xftp7连接虚拟机上传mysql5 7安装包 创建mysql
  • 基于Numpy构建RNN模块并进行实例应用(附代码)

    文章目录 一 写在前面 二 RNN原理介绍说明 1 RNN架构说明 2 RNN的数学模型及代码 正向传播 输入层 隐藏层 正向传播 隐藏层 输出层 反向传播 输出层 隐藏层 反向传播 隐藏层 输入层 三 RNN在实例中的应用 1 实例问题说
  • 【QT】图形化页面设计

    可视化的图形化界面共有三种设计方式 一种是通过可视化来设计界面的方式 一种是代码化的设计方式 最后是混合上面两种的混合界面设计方式 目前我们只考虑通过Designer和代码来设计图形化页面的两种方式 目录 可视化图形界面设计 图形页面设计
  • 算法小白的自我总结

    2018年10月26号 觉得该把这段时间做一下总结了 大概包括心理变化方面 找工作方面吧 csdn为什么没有表情可以用 并且终于在上线新版之后变得没有那么多bug了 快捷键也能用了 界面看起来还可以 为什么把标志性的红色不见了 红色变成了蓝
  • 使用jquery对输入框内容设置自动校验,只允许数字的输入

    目的 对input输入框的内容进行校验 js的方法 keyup 对键盘的进行监控的事件 正则表达式 d g 原理 就是在输入框添加一个 触发事件 对输入框的内容进行判断 过程遇到问题 js和jquery获取值的方法 value是js获取值的
  • 2021-04-28 Mac上插入公式的三种方法

    文章目录 在线方案 自带的Pages更好用 KLatexformular 在线方案 很多网站可以在线编辑 然后下载图片 给一个我用的链接 https latex codecogs com legacy eqneditor editor ph
  • 整型数据在内存中的存储方式大解密

    提示 先赞后看 养成习惯 文章目录 前言 一 原码 反码 补码 二 体验 存 数据的过程 小小的总结一下 三 体验 取 数据的过程 什么是大小端 如何验证一个机器是大端还是小端的存储模式呢 为什么会有大小端之分呢 取 数据 整型数据范围 前
  • 时序预测

    时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 目录 时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍
  • 获取application.yml文件中配置参数的两个方法

    application yml文件内容 第一种 适用于获取少量配置参数 Value man name private String name 第二种 适用于获取大批量配置参数 第一步 整合pom xml文件
  • 操作系统的调度基础

    操作系统的cpu调度 把内核线程当成内核中的一个进程去理解 任务系统的三个核心特征是 权限分级 数据隔离和任务切换 以X86 64架构为例 权限分级通过CPU的多模式机制和分段机制实现 数据隔离通过分页机制实现 任务切换通过中断机制和任务机
  • Java类与接口、类与类之间的六种关系及UML表示

    转自点击打开链接 一 继承关系 继承指的是一个类 称为子类 子接口 继承另外的一个类 父类 父接口 的功能 并可以增加它自己的新功能的能力 在java中继承关系通过关键字extends明确标识 在设计时一般没有争议性 在UML类图设计中 继
  • 10款炫酷的HTML5动画特效,附源码

    HTML5确实非常强大 很多时候我们可以利用HTML5中的新技术实现非常炫酷效果时 这些效果也非常消耗电脑的CPU 但是这些HTML5效果确实能给用户带来不一样的用户体验 今天我要跟大家分享一些HTML5实现的惊艳特效 希望你可以喜欢 1
  • Docker运行容器端口映射

    大致描述 我发现docker启动容器时 以redis为例 在已经启动了一个 p 6379 6379的redis1容器后 当我们开启第二个redis2容器时 右边的端口映射既可以写别的我们想要映射的端口 p 6380 6380 redis2
  • 如何初始化使用中断

    概念 中断向量 中断服务程序的入口地址 首地址 中断向量表 系统中RAM或ROM的一个区域 用于存储各种中断向量的首地址 其大小取决于CPU支持的中断类型和数量 中断优先级 多个中断源同时向CPU申请中断 为了能够有序地处理多个中断申请所以
  • 感悟2022年:玫琳凯公布今年上半年以来的奖项、里程碑和成就

    玫琳凯公司获得30个奖项 其中包括10个雇主奖 凭借卓越的商业表现 社会影响 倡导参与和可持续发展努力而获得认可 玫琳凯公司 Mary Kay Inc 正在感悟2022年的成就 今年上半年 这家标志性的全球创业公司进一步推进皮肤科学创新 继
  • RxODE 包的使用 (CPT tutorial paper part 1)

    本文基于tutorial paper Wang W Hallow KM James DA A Tutorial on RxODE Simulating Differential Equation Pharmacometric Models
  • MIPI-DSI 三种 Video Mode 理解

    D PHY的物理层支持HS High Speed 和LP Low Power 两种工作模式 HS模式 低压查分信号 功耗大 高速率 80M 1Gbps 信号幅值 100mv 300mv LP模式 单端信号 功耗小 速率低 lt 10Mbps
  • QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

    目录 一 创建行表头 二 往表格里插入单元项 带图片和不带图片 三 禁止表格可编辑 四 按行或列或单个选择单元项 五 设置列宽 包括列表头的和行表头的 1 这个普通的行和列都可以设置固定宽高 2 还可以将行和列的大小设为与内容相匹配 3 不