天天看點

qt 之QTableWidget控件 QTableWidget控件總結

QTableWidget控件總結

【1】QTableWidget簡介

QTableWidget是QT對話框設計中常用的顯示資料表格的控件。

學習QTableWidget就要首先看看QTableView控件(控件也是有”家世“的!就像研究人一樣一樣的),因為QTableWidget繼承于類QTableView。

兩者主要差別是QTableView可以使用自定義的資料模型來顯示内容(也就意味着使用時先要通過setModel來綁定資料源),而QTableWidget則隻能使用标準的資料模型。

QTableWidget單元格資料是QTableWidgetItem對象來實作的(即就是不需要資料源,單元格内的資訊需要逐個填充即可)。

這主要由于QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。

使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的其中一個單元格,整個表格都需要用逐個單元格對象QTableWidgetItem建構起來。

【2】QTableWidget控件屬性

(1)禁止編輯表格

在預設情況下,表格裡的字元是可以更改的。

比如輕按兩下一個單元格,就可以修改原來的内容,如果想禁止使用者的這種操作,讓這個表格對使用者隻讀,可以這樣:

1 ui.qtablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);      

(2)設定表格為選擇整行

1 /*設定表格為整行選中*/
2 ui.qtablewidget->setSelectionBehavior(QAbstractItemView::SelectRows);       

(3)設定單個選中和多個選中

單個選中意味着每次隻可以選中一個單元格,多個就是相當于可以選擇”一片“那種模式。

1 /*設定允許多個選中*/ 
2     ui.qtablewidget->setSelectionMode(QAbstractItemView::ExtendedSelection);        

(4)表格表頭的顯示與隐藏

對于水準或垂直方向的表頭,如果不想顯示可以用以下方式進行(隐藏/顯示)設定:

1 ui.qtablewidget->verticalHeader()->setVisible(true);  
2 ui.qtablewidget->horizontalHeader()->setVisible(false);      

(5)設定具體單元格中字型的對齊方式

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

(6)設定具體單元格中字型格式

1 ui.qtablewidget->item(1, 0)->setBackgroundColor(QColor(0,60,10));   
2 ui.qtablewidget->item(1, 0)->setTextColor(QColor(200,111,100)); 
3 ui.qtablewidget->item(1, 0)->setFont(QFont("Helvetica"));       

(7)設定具體單元格的值

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

(8)把QTableWidgetItem對象内容轉換為QString

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

(9)具體單元格中添加控件

1 QComboBox *comBox = new QComboBox(); 
2 comBox->addItem("F"); 
3 comBox->addItem("M"); 
4 ui.qtablewidget->setCellWidget(0,3,comBox);      

(11)合并單元格

1 //合并單元格的效果
2 ui.qtablewidget->setSpan(2, 2, 3, 2);
3 //第一個參數:要改變的單元格行數
4 //第二個參數:要改變的單元格列數
5 //第三個參數:需要合并的行數
6 //第四個參數:需要合并的列數      

(12)具體單元格中插入圖檔

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

(13)設定顯示網格

ui.qtablewidget->setShowGrid(true);//顯示表格線      

(14)設定滾動條

ui.qtablewidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水準滾動條      

(15)設定列标簽

qt 之QTableWidget控件 QTableWidget控件總結
1     //初始化界面
 2     QStringList  HStrList;
 3     HStrList.push_back(QString("name"));
 4     HStrList.push_back(QString("id"));
 5     HStrList.push_back(QString("age"));
 6     HStrList.push_back(QString("sex"));
 7     HStrList.push_back(QString("department"));
 8     
 9 
10     //設定行列數(隻有列存在的前提下,才可以設定列标簽)
11     int HlableCnt = HStrList.count();
12     ui.qtablewidget->setRowCount(10);
13     ui.qtablewidget->setColumnCount(HlableCnt);
14 
15     //設定列标簽
16     ui.qtablewidget->setHorizontalHeaderLabels(HStrList);      
qt 之QTableWidget控件 QTableWidget控件總結

(16)設定行和列的大小設為與内容相比對

1 ui.qtablewidget->resizeColumnsToContents();  
2 ui.qtablewidget->resizeRowsToContents();        

(17)設定字型

ui.qtablewidget->setFont(font);   //設定字型      

(18)擷取某一單元格的内容

1 QString strText = ui.qtablewidget->item(0, 0)->text();      
  在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 之QTableWidget控件 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());      
qt 之QTableWidget控件 QTableWidget控件總結
   OK,虛線邊框去除      問題二:當表格隻有一行的時候,則表頭會出現塌陷問題    
qt 之QTableWidget控件 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 = 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也必然可以實作
qt 之QTableWidget控件 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);    
qt 之QTableWidget控件 QTableWidget控件總結
   OK,重命名完成,!      六、右鍵菜單   (1)建立菜單、菜單項    void TableWidget::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 = new QAction(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   void TableWidget::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,大功告成!   
qt 之QTableWidget控件 QTableWidget控件總結
  七、信号    void cellActivated(int row, int column)   void cellChanged(int row, int column)   void cellClicked(int row, int column)   void cellDoubleClicked(int row, int column)   void cellEntered(int row, int column)   void cellPressed(int row, int column)   void itemActivated(QTableWidgetItem *item)   void itemChanged(QTableWidgetItem *item)   void itemClicked(QTableWidgetItem *item)   void itemDoubleClicked(QTableWidgetItem *item)   void itemEntered(QTableWidgetItem *item)   void itemPressed(QTableWidgetItem *item)   void itemSelectionChanged()   void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)   void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)        關于界面的檔案(夾)圖示和類型如何擷取?對于檔案而言,不同擴充名的檔案至少也有100種以上,如果圖示和類型固定寫死的話必不可行,是以,這裡提供以下兩種方式擷取。
  • Qt之QFileIconProvider(擷取檔案圖示、類型).
  • Qt之QFileIconProvider續(擷取檔案圖示、類型). 

更多關于QTableView的資料請參考:

  • Qt之模型/視圖(實時更新資料).
  • Qt之QTableView.

    以上都是在接觸Qt以來總結的一些小經驗,希望對大家有用!不積跬步無以至千裡,不積小流無以成江河。。。

Qt

繼續閱讀