• 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 modifytime")<<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; 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;}");

     

      好了,样式设置完毕。效果例如以下所看到的:

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

     

      问题一:鼠标点击的选项会出现虚框。在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());

     

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

       OK。虚线边框去除

     

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

       QTableWidget具体解释(样式、右键菜单、表头塌陷、多选等)
       摸索了非常长时间,才得以解决:

      //点击表时不正确表头行光亮(获取焦点) 
      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 = newQTableWidgetItem();
      QTableWidgetItem *item1 = newQTableWidgetItem();
      QTableWidgetItem *item2 = newQTableWidgetItem();
      QTableWidgetItem *item3 = newQTableWidgetItem();

      //设置相应的图标、文件名、最后更新时间、相应的类型、文件大小
     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(intcolumn)
      {
         //column为所点击的表头的某列
      }

     

      五、打开某行进行编辑

     既然模拟Window那么就模仿的像一点,Windows能够改动名称,那么Qt也必定能够实现

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

       //获得当前节点并获取编辑名称
       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);


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

       OK。重命名完毕。!

     

       六、右键菜单

      (1)创建菜单、菜单项

       voidTableWidget::createActions()
      {
        //创建菜单项
        pop_menu= new QMenu();
        action_name= new QAction(this);
        action_size= new QAction(this);
        action_type= new QAction(this);
        action_date= new QAction(this);

        action_open= newQAction(this);   
        action_download= new QAction(this);
        action_flush= new QAction(this);

        action_delete= new QAction(this);
        action_rename= new QAction(this);
        action_create_folder= new QAction(this);

     

       action_open->setText(QString("打开"));

       action_download->setText(QString("下载"));

       action_flush->setText(QString("刷新"));

       action_delete->setText(QString("删除"));

       action_rename->setText(QString("重命名"));

       action_create_folder->setText(QString("新建目录"));

        action_name->setText(QString("名称"));
        action_size->setText(QString("大小"));
       action_type->setText(QString("项目类型"));
       action_date->setText(QString("改动日期"));

       

       //设置快捷键

       action_flush->setShortcut(QKeySequence::Refresh);

     

       //设置目录图标
       action_create_folder->setIcon(icon);

       QObject::connect(action_create_folder, SIGNAL(triggered()), this,SLOT(createFolder()));
     

      (2)又一次实现contextMenuEvent

      voidTableWidget::contextMenuEvent(QContextMenuEvent *event)
      {
        pop_menu->clear(); //清除原有菜单
        QPoint point= event->pos(); //得到窗体坐标

       QTableWidgetItem *item =this->itemAt(point);

        if(item!= NULL)

        {

          pop_menu->addAction(action_download);
          pop_menu->addAction(action_flush);
          pop_menu->addSeparator();
          pop_menu->addAction(action_delete);
          pop_menu->addAction(action_rename);
          pop_menu->addSeparator();
           pop_menu->addAction(action_create_folder);

          sort_style = pop_menu->addMenu("排序");
          sort_style->addAction(action_name);
           sort_style->addAction(action_size);
          sort_style->addAction(action_type);
          sort_style->addAction(action_date);

          

          //菜单出现的位置为当前鼠标的位置
           pop_menu->exec(QCursor::pos());
           event->accept();

       

     }

     

      OK,大功告成!

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


      七、信号 

      void cellActivated(int row, intcolumn)
      void cellChanged(int row, int column)
      void cellClicked(int row, int column)
      void cellDoubleClicked(int row, intcolumn)
      void cellEntered(int row, int column)
      void cellPressed(int row, int column)
      voiditemActivated(QTableWidgetItem *item)
      void itemChanged(QTableWidgetItem *item)
      void itemClicked(QTableWidgetItem *item)
      void itemDoubleClicked(QTableWidgetItem*item)
      void itemEntered(QTableWidgetItem *item)
      void itemPressed(QTableWidgetItem *item)
      void itemSelectionChanged()

      voidcurrentItemChanged(QTableWidgetItem *current, QTableWidgetItem*previous)

      void currentCellChanged(intcurrentRow, int currentColumn, int previousRow, intpreviousColumn)
      

       关于界面的文件(夹)图标和类型怎样获取?对于文件而言,不同扩展名的文件至少也有100种以上,假设图标和类型固定写死的话必不可行。所以。这里提供下面两种方式获取。


    很多其它关于QTableView的资料请參考:


       以上都是在接触Qt以来总结的一些小经验。希望对大家实用!

    不积跬步无以至千里。不积小流无以成江河。

    。。


    注:
       技术在于交流、沟通,转载请注明出处并保持作品的完整性。
       作者:╰☆奋斗ing❤孩子` 
  • 相关阅读:
    计算机网络
    git学习总结
    MySQL性能优化的21条最佳经验【转】
    为什么Laravel是最成功的PHP框架?
    分布式集群系统下的高可用session解决方案
    浏览器中输入URL到返回页面的全过程
    真正的inotify+rsync实时同步 彻底告别同步慢
    memcache中的add和set方法区别
    php 接口 implements 使用
    Redis的PHP操作手册(自用)
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7241793.html
Copyright © 2020-2023  润新知