Qt Qtableview 的一些用法


Qt Qtableview 的一些用法

標簽: Qt Qtableview
一些Qtableview的用法:
 
一、Qtableview主要借助於QStandardItemModel類來使用,最后再把QStandardItemModel的對象set進去即可
 
QTableView *tableview;
QStandardItemModel *model = new QStandardItemModel();
Qtableview用的mvc模式  實際上用到的是model/view居多
tableview->setmodel(model);來使用model
model->setHeaderdata();設置表的column名稱;
當然如果想隱藏column名稱的話 只需要用:tableview->horizontalHeader()->setVisible(false); 
隱藏row名稱:tableview->verticalHeader()->setVisible(false);
若是想設置表格column的樣式 使用:tableview->->horizontalHeader()->setStyleSheet();
使用setColumnWidth()來設置Header的寬度;
QT還提供了對表格表頭進行設置的model:
tableview->horizontalHeader()->setResizeMode();
tableview->verticalHeader()->setResizeMode(); 
Qt提供的 setResizeMode()有四種:
QHeaderView::Interactive;
QHeaderView::Fixed;
QHeaderView::Stretch;
QHeaderView::ResizeToContents; 
對表格表頭設置完之后,接下來就是表格之中的item:
要得到當前選中的item,如下操作:
QModelIndex Index = tableview->currentIndex();得到當前的Index;
QStandardItem *item = listAll->itemFromIndex(index);//根據index 得到item
如果想讓點擊item 發送信號 則可以使用:
connect(tableview, SIGNAL(clicked ( const QModelIndex &)), this,
  SLOT(Function(const QModelIndex &)));//點擊tableview中的item觸發信號
 
若要對item可以設置背景顏色  使用:setBackground()即可;
 
 
二、
 

QStandardItemModel model;

//設置大小

model.setColumnCount(3);    //列
model.setRowCount(musicFound);    //行

//設置標題

model.setHeaderData(0,Qt::Horizontal,"ID");

 

//添加數據

for(int j=0;j<row;j++)
{
            //寫id
            QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
            model.setItem(j,0,itemID);

}

//選擇這個model

m_ui->tableView->setModel(&model);

//隱藏左邊那列
m_ui->tableView->verticalHeader()->hide();
//列寬
m_ui->tableView->setColumnWidth(0,30);
//整行選擇
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

 

三 動態添加行

    在表格中添加行時,我們只需要在model中插入數據即可,一旦model中的數據發生變化,QTabelView顯示就會做相應的變動

    //在第一行添加學生張三的個人信息(setItem函數的第一個參數表示行號,第二個表示列號,第三個為要顯示的數據)
    student_model->setItem(0, 0, new QStandardItem(“張三"));
    student_model->setItem(0, 1, new QStandardItem("20120202"));
    student_model->setItem(0, 2, new QStandardItem("男"));
    student_model->setItem(0, 3, new QStandardItem("18"));
    student_model->setItem(0, 4, new QStandardItem("土木學院"));

 

四 設置列名

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));//編碼設置為GB18030 
 setValueModel->setHorizontalHeaderLabels(QStringList() <<tr("名稱")<<tr("單位")<<tr("取值范圍")<<tr("定值"));
 setValueTableView->setModel(setValueModel);//!!!
 setValueTableView->horizontalHeader()->setStretchLastSection(true);//最后一列對窗口動態變化

設置數據顯示的樣式

//設置單元格文本居中,張三的數據設置為居中顯示
    student_model->item(0, 0)->setTextAlignment(Qt::AlignCenter);
    student_model->item(0, 1)->setTextAlignment(Qt::AlignCenter);
    student_model->item(0, 2)->setTextAlignment(Qt::AlignCenter);
    student_model->item(0, 3)->setTextAlignment(Qt::AlignCenter);
    student_model->item(0, 4)->setTextAlignment(Qt::AlignCenter);

    //設置單元格文本顏色,張三的數據設置為紅色
    student_model->item(0, 0)->setForeground(QBrush(QColor(255, 0, 0))); 
    student_model->item(0, 1)->setForeground(QBrush(QColor(255, 0, 0))); 
    student_model->item(0, 2)->setForeground(QBrush(QColor(255, 0, 0))); 
    student_model->item(0, 3)->setForeground(QBrush(QColor(255, 0, 0))); 
    student_model->item(0, 4)->setForeground(QBrush(QColor(255, 0, 0)));

    //將字體加粗
    student_model->item(0, 0)->setFont( QFont( "Times", 10, QFont::Black ) );
    student_model->item(0, 1)->setFont( QFont( "Times", 10, QFont::Black ) );
    student_model->item(0, 2)->setFont( QFont( "Times", 10, QFont::Black ) );
    student_model->item(0, 3)->setFont( QFont( "Times", 10, QFont::Black ) );
    student_model->item(0, 4)->setFont( QFont( "Times", 10, QFont::Black ) );

    //設置排序方式,按年齡降序顯示
    student_model->sort(3, Qt::DescendingOrder);

 

六 、參考2

QTableView是Qt中用來把數據集以表格形式提供給用戶的一個控件,它與C++Builder中的DBGrid作用類似。坦白的說,DBGrid的使用要比QTableView更容易一些。但QTableView在使用麻煩的同時,也提供了更多的靈活性。

  軟件環境: ubuntu

  最終效果圖:

   634868407862099609.jpg

  一、添加表頭:

  1. QStandardItemModel *model = new QStandardItemModel();
  2. model->setColumnCount(2);
  3. model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("卡號"));
  4. model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));

復制代碼

  二、設置表格屬性:

  1. ui->tableView->setModel(model);
  2. //表頭信息顯示居左
  3. ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
  4. //設置列寬不可變
  5. ui->tableView->horizontalHeader()->setResizeMode(0,QHeaderView::Fixed);
  6. ui->tableView->horizontalHeader()->setResizeMode(1,QHeaderView::Fixed);
  7. ui->tableView->setColumnWidth(0,101);
  8. ui->tableView->setColumnWidth(1,102);

復制代碼

  注:在進行表格設置時必須是“ui->tableView->setModel(model);”在前,屬性具體設置在后,

  反之則設置不會生效。如上述代碼所示。

  三、添加行(添加三行一樣的信息):

  1.  for(int i = 0; i < 3; i++)
  2.  {
  3.      model->setItem(i,0,new QStandardItem("2009441676"));
  4.         //設置字符顏色
  5.      model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));
  6.         //設置字符位置
  7.      model->item(i,0)->setTextAlignment(Qt::AlignCenter);
  8.      model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("哈哈")));
  9.  }

復制代碼

  四、刪除行:

  1. //x是指定刪除哪一行
  2. model->removeRow(x);
  3. //刪除所有行
  4. model->removeRows(0,model->rowCount());

復制代碼

  再舉一個例子:

  在一個葯品划價模塊中有這樣的操作流程:

  檢索處方項目成功后,把該項目顯示到QTableView里,把需要編輯的數量字段提供給用戶輸入,用戶輸入確認后,該項目留在列表中,然后開始下一項目檢索錄入。

  實現過程如下:

  錄入的項目保留在臨時表tmp中,界面上的QTableView取名為tbList,與tbList關聯的Model取名為tb1。檢索成功后,把檢索結果插入到臨時表中,把需要編輯的字段提供給用戶。

  1. tb1=newQSqlTableModel(this,*dbR); //dbR是本應用中的數據源
  2. tb1->setTable("tmp"); //處方臨時表

復制代碼

  程序中需要顯示的時候,

  1. tbList->setModel(NULL); //清除原先數據集
  2. tbList->setModel(tb1); //刷新顯示

復制代碼

  程序中需要提供編輯輸入的時候

  1. QModelIndexmdidx=m_ui->tbList->model()->index(row,column); //獲得需要編輯的單元格的位置
  2. m_ui->tbList->setFocus(); //把輸入焦點交給tbList
  3. m_ui->tbList->setCurrentIndex(mdidx); //設定需要編輯的單元格
  4. m_ui->tbList->edit(mdidx); //開始編輯

復制代碼

  有一個問題需要注意。向QTableView中添加記錄時,字段一定要完整,不能有空白字段,否則結果無法保存。切記。

  如果需要對用戶輸入做限制,比如只能在指定的字段輸入指定的數據類型,可以通過QItemDelegate來實現。

  貼一段代碼,說明QTableView基本用法

  1. QStandardItemModel model;
  2. //設置大小
  3. model.setColumnCount(3); //列
  4. model.setRowCount(musicFound); //行
  5. //設置標題
  6. model.setHeaderData(0,Qt::Horizontal,"ID");
  7. //添加數據
  8. for(int j=0;j<row;j++)
  9. {
  10.             //寫id
  11.             QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
  12.             model.setItem(j,0,itemID);
  13. }
  14. //選擇這個model
  15. m_ui->tableView->setModel(&model);
  16. //隱藏左邊那列
  17. m_ui->tableView->verticalHeader()->hide();
  18. //列寬
  19. m_ui->tableView->setColumnWidth(0,30);
  20. //整行選擇
  21. m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

 

QStandardItemModel model;

//設置大小

model.setColumnCount(3);    //列
model.setRowCount(musicFound);    //行

//設置標題

model.setHeaderData(0,Qt::Horizontal,"ID");

 

//添加數據

for(int j=0;j<row;j++)
{
            //寫id
            QStandardItem *itemID = new QStandardItem("hello");//QString::number(j)));
            model.setItem(j,0,itemID);

}

//選擇這個model

m_ui->tableView->setModel(&model);

//隱藏左邊那列
m_ui->tableView->verticalHeader()->hide();
//列寬
m_ui->tableView->setColumnWidth(0,30);
//整行選擇
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

 

 

Qt之QTableView

  (2014-02-20 15:29:11)
    之前有講解過QTableWidget的使用( QTableWidget詳解(樣式、右鍵菜單、表頭塌陷、多選等)),已經算是很詳細了,這節再講更常用的視圖部件QTableView的高級用法。
    Qt中有幾種純粹的視圖部件:QListView、QTableView、QColumnView、QTreeView,所有的這些視圖都必須提供一個模型(無論是自定義,還是Qt中已提供的)來與之配合。Qt仍然提供了一些便利的窗口部件(“便利”是因為它們提供了自己內置的模型,並能直接使用),如;QListWidget、QTableWidget、和QTreeWidget。還有QComboBox,既是一個便利的窗口部件也是一個視圖部件,也就是說,我們既可以直接使用(因為它提供了內置的模型),也能把它當做一個模型的視圖部件(這種情況下,可以提供一個合適的模型給它)。
    之所以說視圖部件常用,是因為在編程的過程當中經常遇到大數據集,使用視圖/模型就顯得更有效率。當然,對於數據集較小(數百或數千個項)的應用程序,選擇便利部件比較合適。
    這節不再去過多的講解模型/視圖如何使用( Qt之模型/視圖(實時更新數據)一節有特別介紹),更多的是討論QTableView的深入用法。
 
一、實現QToolTip
1.設置鼠標跟隨
table_view->setMouseTracking(true); 
2.實現自定義槽函數
void TableView::showToolTip(const QModelIndex &index)
{
        if(!index.isValid())
                return;

        int row = index.row();
        QString file_name = list_file.at(row);

        if(file_name.isEmpty())
                return;

        QToolTip::showText(QCursor::pos(), file_name); 
}
3.連接信號與槽
connect(this, &TableView::entered, this, &TableView::showToolTip); 
 
效果如下:
Qt之QTableView
 
 
二、整行選中(去掉選中時的虛線),並設置選中色
1.設置整行選中
table_view->setSelectionBehavior(QAbstractItemView::SelectRows); 
2.實現自定義委托(QStyledItemDelegate)
void StyledDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
{  
        QStyleOptionViewItem  view_option(option);  
        if (view_option.state & QStyle::State_HasFocus) {  
                view_option.state = view_option.state ^ QStyle::State_HasFocus;  
        }

        QStyledItemDelegate::paint(painter, view_option, index);
}
3.設置委托
table_view->setItemDelegate(styled_delegate);
4.使用QSS設置選中色
QTableView{
        border:none;
        background:white;
}
QTableView::item:selected{
        color:white;
        background:rgb(34, 175, 75);    
}
 
效果如下:
Qt之QTableView
 
三、設置鼠標滑過顏色
 
1.鼠標滑過某item項高亮(自定義代理里面添加滑過樣式)
void StyledDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const  
{  
        QStyleOptionViewItem  view_option(option);  
        if (view_option.state & QStyle::State_HasFocus) {  
                view_option.state = view_option.state ^ QStyle::State_HasFocus;  
        }

        //添加鼠標滑過的背景色
        if(option.state & QStyle::State_MouseOver){
                painter->fillRect(view_option.rect, QColor(180, 200, 220));
        }

        QStyledItemDelegate::paint(painter, view_option, index);
}  
 
效果如下:
Qt之QTableView

    這種情況下,可以看出,當鼠標滑過某個item項的時候,改項會改變顏色,但選中的時候是整行選中,則看起來很不協調,下面將講述如何實現鼠標滑過后整行高亮效果。
 
2.鼠標滑過整行高亮
 
自定義視圖中實現以下幾個方法:
void TableView::mouseMoveEvent ( QMouseEvent * event)
{ int row = indexAt(event->pos()).row(); updateRow(row); }
void TableView::leaveEvent ( QEvent * event )
{
table_model->setHoverRow(-1);
int column_count= model()->columnCount(); for (int i = column_count- 1; i >= 0; i--) { update(model()->index(current_row, i)); } current_row = -1; }
void TableView::updateRow(int row)
{ if (row == current_row) return;
table_model->setHoverRow(row);
int column_count= model()->columnCount(); for (int i = column_count- 1; i >= 0; i--) { update(model()->index(current_row, i)); update(model()->index(row, i)); } table_model->showToolTip(row); //自定義方法用來進行QToolTip的顯示 current_row = row; }
 
自定義模型中實現以下幾個方法:
void TableModel::setHoverRow(int hover_row)
{ this->hover_row = hover_row; }
QVariant ConvertPdfModel::data(const QModelIndex &index, int role) const
{
        if (!index.isValid())
                return QVariant();

        int row = index.row();  //行號
        if (row < 0 || row >= list_file.size())
                return QVariant();

        int column = index.column();
        QString name = list_file.at(row);
        switch (role) {
        case Qt::BackgroundColorRole:{
                        if (row == hover_row) {
                                return QColor(180, 200, 220);
                        }
                }
        case Qt::DecorationRole: {  //圖標
                        //...
                }
        case Qt::DisplayRole: {  //文本
                        //...
                }
        case Qt::TextAlignmentRole: {  //對齊方式
                        //...
                }
        default:
                return QVariant();
        }

        return QVariant();
}
 
效果如下:
Qt之QTableView
    updateRow主要是進行顏色更新的,鼠標所在行號若與之前的行號保持一致(鼠標一直處於當前行),則直接返回,否則(行號改變),進行更新。mouseMoveEvent、leaveEvent主要處理鼠標移動、離開過程中的邏輯 —— 然后調用updateRow函數進行實時更新。
 
總結:   
    以上針對QTableView做了高級、深入的講解,加上之前章節對模型/視圖的詳細用法的介紹,大家應該對這些控件有了更深入的了解,並能更好的使用它們。關於如何處理更為細節的問題,根據這些介紹也能悟出一二,所有的東西都不能盡善盡美,留下的小細節就在實戰中慢慢摸索,也許只有遇到困難時,你才會發現還有進步的空間。。。
 
 
注:
    技術在於交流、溝通,轉載請注明出處並保持作品的完整性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM