QTableWidget详解(样式、右键菜单、表头塌陷、多选等)



在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚。所以,今天就在这里总结一下!

  以下为个人模拟Windows资源管理器的一个表单

 

 一、设置表单样式

  table_widget->setColumnCount(4); //设置列数

  table_widget->horizontalHeader()->setDefaultSectionSize(150); 
  table_widget->horizontalHeader()->setClickable(false); //设置表头不可点击(默认点击后进行排序)

 

  //设置表头内容
  QStringList header;
  header<<tr("name")<<tr("last modify time")<<tr("type")<<tr("size");
  table_widget->setHorizontalHeaderLabels(header);

 

  //设置表头字体加粗

  QFont font = this->horizontalHeader()->font();
  font.setBold(true);
  table_widget->horizontalHeader()->setFont(font);

 
  table_widget->horizontalHeader()->setStretchLastSection(true); //设置充满表宽度
  table_widget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
  table_widget->verticalHeader()->setDefaultSectionSize(10); //设置行高
  table_widget->setFrameShape(QFrame::NoFrame); //设置无边框
  table_widget->setShowGrid(false); //设置不显示格子线
  table_widget->verticalHeader()->setVisible(false); //设置垂直头不可见
  table_widget->setSelectionMode(QAbstractItemView::ExtendedSelection);  //可多选(Ctrl、Shift、  Ctrl+A都可以)
  table_widget->setSelectionBehavior(QAbstractItemView::SelectRows);  //设置选择行为时每次选择一行
  table_widget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑
  table_widget->horizontalHeader()->resizeSection(0,150); //设置表头第一列的宽度为150
  table_widget->horizontalHeader()->setFixedHeight(25); //设置表头的高度

  table_widget->setStyleSheet("selection-background-color:lightblue;"); //设置选中背景色

  table_widget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); //设置表头背景色

 

  //设置水平、垂直滚动条样式

  table_widget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}"
  "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
  "QScrollBar::handle:hover{background:gray;}"
  "QScrollBar::sub-line{background:transparent;}"
  "QScrollBar::add-line{background:transparent;}");

  table_widget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}"
  "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
  "QScrollBar::handle:hover{background:gray;}"
  "QScrollBar::sub-line{background:transparent;}"
  "QScrollBar::add-line{background:transparent;}");

 

  好了,样式设置完成,效果如下所示:


 

  问题一:鼠标点击的选项会出现虚框,在Qt官网找到一篇博客专门介绍的,直接上代码!

  (1)实现如下一个类

  #include "no_focus_delegate.h"

  void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex& index) const
  {
     QStyleOptionViewItem itemOption(option);
     if (itemOption.state & QStyle::State_HasFocus)
     {
        itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
     }

     QStyledItemDelegate::paint(painter, itemOption, index);
  }

  (2)表格构造中添加如下代码

   table_widget->setItemDelegate(new NoFocusDelegate());

 

  

   OK,虚线边框去除

 

   问题二:当表格只有一行的时候,则表头会出现塌陷问题

  
   摸索了很长时间,才得以解决:

   //点击表时不对表头行光亮(获取焦点) 
   table_widget->horizontalHeader()->setHighlightSections(false); 

 

 二、多选并获取所选行

this->setSelectionMode(QAbstractItemView::ExtendedSelection);  //设置多选(可以Ctral+A全选Ctral+Shift多选)获取所选行号:

bool TableWidget::getSelectedRow(QSet&set_row)

{

    QList items = this->selectedItems();

    int item_count = items.count();

    if(item_count <= 0)

    {

        return false;

    }

    for(int i=0; i

    {

        //获取选中的行

        int item_row = this->row(items.at(i));

        set_row.insert(item_row);

    }

    return  true;

}

 

  三、操作表单(添加、删除行等)

  (1)动态插入行

  int row_count = table_widget->rowCount(); //获取表单行数
  table_widget->insertRow(row_count); //插入新行

  QTableWidgetItem *item = new QTableWidgetItem();
  QTableWidgetItem *item1 = new QTableWidgetItem();
  QTableWidgetItem *item2 = new QTableWidgetItem();
  QTableWidgetItem *item3 = new QTableWidgetItem();

  //设置对应的图标、文件名称、最后更新时间、对应的类型、文件大小
  item->setIcon(icon); //icon为调用系统的图标,以后缀来区分   
  item->setText(name);
  item1->setText(last_modify_time);
  item2->setText(type); //type为调用系统的类型,以后缀来区分

  item3->setText(size);

  table_widget->setItem(row_count, 0, item);
  table_widget->setItem(row_count, 1, item1);    
  table_widget->setItem(row_count, 2, item2);
  table_widget->setItem(row_count, 3, item3);

  //设置样式为灰色
  QColor color("gray");
  item1->setTextColor(color);
  item2->setTextColor(color);
  item3->setTextColor(color);

  (2)在指定位置插入行

  其实跟(1)相似,(1)的前提是获取到表格行数

  table_widget->insertRow(row); //插入新行 row为插入的位置

 

  四、单击表头触发的事件

  (1)连接表头的信号和槽

  connect(horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(onHeaderClicked(int)));

 

 (2)实现槽函数

  void TableWidget::onHeaderClicked(int column)
  {
      //column为所点击的表头的某列
  }

 

  五、打开某行进行编辑

  既然模拟Window那么就模仿的像一点,Windows可以修改名称,那么Qt也必然可以实现

   //获得当前节点并获取编辑名称
   QTableWidgetItem *item = table_widget->item(edit_row, 0); //edit_row为想要编辑的行号
   table_widget->setCurrentCell(edit_row, 0);
   table_widget->openPersistentEditor(item); //打开编辑项
   table_widget->editItem(item);

 

   //关闭编辑项

   table_widget->closePersistentEditor(item);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
要在QTableWidget中添加右键菜单,可以使用以下步骤: 1. 创建一个QMenu对象,用于显示右键菜单。 2. 连接表格小部件的customContextMenuRequested()信号到一个槽函数,该槽函数将显示右键菜单。 3. 在槽函数中,使用QTableWidget的currentRow()和currentColumn()方法获取当前选定的单元格的行和列。 4. 使用QTableWidget的item()方法获取当前选定单元格的QTableWidgetItem对象。 5. 在右键菜单中添加所需的操作,例如复制或删除单元格的内容。 下面是一个简单的示例代码: ```python from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QMenu, QAction, QApplication, QMainWindow, QWidget from PyQt5.QtCore import Qt class MyTableWidget(QTableWidget): def __init__(self, parent=None): super().__init__(parent) self.setRowCount(3) self.setColumnCount(3) self.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3']) self.setVerticalHeaderLabels(['Row 1', 'Row 2', 'Row 3']) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.showContextMenu) def showContextMenu(self, pos): row = self.currentRow() col = self.currentColumn() item = self.item(row, col) menu = QMenu(self) copyAction = QAction('Copy', self) deleteAction = QAction('Delete', self) copyAction.triggered.connect(lambda: QApplication.clipboard().setText(item.text())) deleteAction.triggered.connect(lambda: self.setItem(row, col, QTableWidgetItem(''))) menu.addAction(copyAction) menu.addAction(deleteAction) menu.exec_(self.mapToGlobal(pos)) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.tableWidget = MyTableWidget(self) self.setCentralWidget(self.tableWidget) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 这个示例创建了一个QTableWidget,它包含3行和3列,并使用水平和垂直标头标记了行和列。它还连接了customContextMenuRequested信号到showContextMenu槽函数。 showContextMenu槽函数获取当前选定的单元格的行和列,以及该单元格的QTableWidgetItem对象。它创建一个QMenu对象,并添加了两个操作:复制和删除。复制操作将当前单元格的文本复制到剪贴板中,而删除操作将当前单元格的内容设置为空。最后,它在右键单击位置显示了菜单

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值