天天看點

轉載: QTableWidget詳解(樣式、右鍵菜單、表頭塌陷、多選等)

文章轉載自:http://blog.sina.com.cn/s/blog_a6fb6cc90101dd5u.html

在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->horizontalHeader()->setStyleSheet("QHeaderView{background:blue}");    //設定表頭空餘部分的背景色

  //設定水準、垂直滾動條樣式

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

//設定表頭不可滑鼠拖動改變寬度、高度

    tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);

    tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);

    tableWidget->horizontalHeader()->setDisabled(true);    //設定列不能拖動

    tableWidget->verticalHeader()->setDisabled(true);        //設定行不能拖動

  好了,樣式設定完成,效果如下所示:

轉載: 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());

   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 = 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也必然可以實作

轉載: 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);

   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,大功告成!

  七、信号 

  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種以上,如果圖示和類型固定寫死的話必不可行,是以,這裡提供以下兩種方式擷取。

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

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

注:     技術在于交流、溝通,轉載請注明出處并保持作品的完整性。

繼續閱讀