QTableWidget常用技巧

本人在Qt開發應用程序時用到QTableWidget控件,總結一些常用技巧。

1.表格顯示設置

    ui->IOtable->setRowCount(20);                    //設置表格行數
    ui->IOtable->setColumnCount(7);                 //設置表格列數
    QHeaderView* headerView = ui->IOtable->verticalHeader();
    headerView->setHidden(true);                   //隱藏最前面的序號行
    QStringList labels;
    labels <<IOTABLE_TYPE_ZH<<IOTABLE_NAME_ZH<<IOTABLE_VALUE_ZH<<IOTABLE_BUS_ZH<<IOTABLE_UNIT_ZH<<IOTABLE_UNITMAP_ZH<<IOTABLE_BSIM_ZH;                          //設置每一列小標題
    QFont font = ui->IOtable->horizontalHeader()->font();
    font.setBold(false);
    ui->IOtable->horizontalHeader()->setFont(font);                              //設置表頭字體
    ui->IOtable->setHorizontalHeaderLabels(labels);
    ui->IOtable->horizontalHeader()->setSectionResizeMode(TYPE_COLUMN, QHeaderView::Stretch);
    ui->IOtable->horizontalHeader()->setSectionResizeMode(NAME_COLUMN, QHeaderView::ResizeToContents); //用戶不可更改列寬
    ui->IOtable->horizontalHeader()->setSectionResizeMode(VALUE_COLUMN, QHeaderView::Stretch);
    ui->IOtable->horizontalHeader()->setSectionResizeMode(BUSTYPE_COLUMN, QHeaderView::ResizeToContents);
    ui->IOtable->horizontalHeader()->setSectionResizeMode(UNIT_COLUMN, QHeaderView::Stretch);
    ui->IOtable->horizontalHeader()->setSectionResizeMode(UNITMAP_COLUMN, QHeaderView::ResizeToContents);    //根據空間自動改變列寬
    ui->IOtable->horizontalHeader()->setSectionResizeMode(SIM_COLUMN, QHeaderView::Stretch);


    connect(ui->IOtable->horizontalHeader(),SIGNAL(sectionClicked(int)),\
                                       this,  SLOT(  sortByColumn(int)));                                  //自定義槽函數,點擊表頭排序

    ui->IOtable->setColumnWidth(TYPE_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setColumnWidth(NAME_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setColumnWidth(VALUE_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setColumnWidth(BUSTYPE_COLUMN, WinSize::lx2px(150));
    ui->IOtable->setColumnWidth(UNIT_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setColumnWidth(UNITMAP_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setColumnWidth(SIM_COLUMN, WinSize::lx2px(120));
    ui->IOtable->setSelectionBehavior(QAbstractItemView::SelectRows);     //設置表格爲整行選中
    /*設置選中目標個數*/
    ui->IOtable->setSelectionMode(QAbstractItemView::SingleSelection);    //選中單個目標
//    ui->IOtable->setSelectionMode(QAbstractItemView::ExtendedSelection);
//    ui->IOtable->setSelectionMode(QAbstractItemView::MultiSelection);    //選中多個目標
    ui->IOtable->setEditTriggers (QAbstractItemView::NoEditTriggers);     //將表格變爲禁止編輯
//    ui->IOtable->setAlternatingRowColors(true);                         //設置隔行變色,一灰一白
    ui->IOtable->verticalHeader()->setFixedWidth(120);
    ui->IOtable->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->IOtable->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->IOtable->setEditTriggers(QAbstractItemView::NoEditTriggers);


2.表格添加元素

    QTableWidgetItem *dateTime = new QTableWidgetItem(logTmp->logTime);
    ui->eventLogTable->setItem(0, DATE_COLUMN, dateTime);
    dateTime->setTextAlignment(Qt::AlignHCenter |  Qt::AlignVCenter);            //每個單元格文字居中顯示

    QTableWidgetItem *logType = new QTableWidgetItem(logTmp->typeText);
    ui->eventLogTable->setItem(0, TYPE_COLUMN, logType);
    logType->setTextAlignment(Qt::AlignHCenter |  Qt::AlignVCenter);

    QString domain;
    domain =    QString("%1").arg(logTmp->domainNumber,4,16,QLatin1Char('0'));
    QString error;
    error = "0x"+domain+QString("%1").arg(logTmp->errorCodeNo, 4,16,QLatin1Char('0'));

    QTableWidgetItem *errorCode = new QTableWidgetItem(error);
    ui->eventLogTable->setItem(0, CODE_COLUMN, errorCode);
    errorCode->setTextAlignment(Qt::AlignHCenter |  Qt::AlignVCenter);

    QTableWidgetItem *titleItem = new QTableWidgetItem(logTmp->titleText);
    ui->eventLogTable->setItem(0, TITLE_COLUMN, titleItem);
    titleItem->setTextAlignment(Qt::AlignHCenter |  Qt::AlignVCenter);

    分別設計好一行中每個表格元素(列總數),按行插入到表格中。

3.QTableWidget 美化設計技巧

基本外觀設置

FriendTable->setFrameShape(QFrame::NoFrame);  //設置邊框

FriendTable->setHorizontalHeaderLabels(HeadList);  設置表頭

FriendTable->setSelectionMode(QAbstractItemView::SingleSelection);   設置選擇的模式爲單選擇

FriendTable->setSelectionBehavior(QAbstractItemView::SelectRows);    設置選擇行爲時每次選擇一行

FriendTable->setShowGrid(false);   設置不顯示格子線

FriendTable->setFont(font);   設置字體

 ,用void hideColumn ( int column )這個就可以隱藏某一列
用這個void showColumn ( int column )顯示某一列

設置表單背景或透明

QPalette pal = musicTable->palette();
    pal.setBrush(this->backgroundRole(),QBrush(QPixmap("images/background.png")) );
    musicTable->setPalette( pal );

設置它的背景圖片,也可以將QBrush初始化爲QColor來設置背景顏色

 

QPalette pll = musicTable->palette();

pll.setBrush(QPalette::Base,QBrush(QColor(255,255,255,0)));

musicTable->setPalette(pll);  //和QTextEdit一樣,都可以使用樣式表QPalette來修改它的背景顏色和背景圖片,這裏我們把刷子設置爲全透明的,就可以是透明的


在QTableWidget列表中添加圖片的方法   
QTableWidgetItem *cubesHeaderItem = new QTableWidgetItem(tr("Cubes"));
cubesHeaderItem->setIcon(QIcon(QPixmap("1.png")));
cubesHeaderItem->setTextAlignment(Qt::AlignVCenter);
 musicTable->setItem(1,1,cubesHeaderItem);   //在第一行第一列中顯示圖片

 

*******************表頭的屬性修改****************

musicTable->horizontalHeader()->resizeSection(0,150);  //修改表頭第一列的寬度爲150

 musicTable->horizontalHeader()->setFixedHeight(25);  //修改表頭合適的高度

musicTable->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:lightblue;color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");    //設置表頭字體,顏色,模式

 

 FriendTable->verticalHeader()->setStyleSheet("QHeaderView::section {  background-color:skyblue;color: black;padding-left: 4px;border: 1px solid #6c6c6c}");   //設置縱列的邊框項的字體顏色模式等

 

 

 

本來想找找QT裏有沒有現成的API的,結果沒有找到,只能自己寫了。
實現也好實現,QTableWidgetItem裏面有修改背景色的API,直接調用,然後用循環控制隔行換色即可。
實現代碼:
void testtt::changeColor(QTableWidget *tablewidget){
for (int i = 0;i < tablewidget->rowCount();i++)
{
      if (i % 2 == 0)
      {
            for (int j = 0;j < tablewidget->columnCount();j++)
           {
                 QTableWidgetItem *item = tablewidget->item(i,j);
                 if (item)
                {
                     const QColor color = QColor(252,222,156);
                      item->setBackgroundColor(color);
                 }
           }
     }
}

 

 

使用

向表中插入一項

  QTableWidgetItem *num=new QTableWidgetItem(QTableWidgetItem::Type);
            num->setCheckState(Qt::Unchecked);   //加入複選框
            num->setIcon(QIcon("images/fetion.png"));  //加入ICon
            num->setText(InfoList.at(i).name);
            num->setFont(font);
            num->setTextColor(color);
            num->setFlags(num->flags() ^ Qt::ItemIsEditable);

            int currentRow=FriendTable->rowCount();  //插入到最後
            FriendTable->insertRow(currentRow);
            FriendTable->setItem(currentRow,0,num);  //插入該Item
            FriendTable->selectRow(0);   選擇第一行

刪除某一行 列

FriendTable->removeRow(row);

FriendTable->removeColumn (column );

 

信號

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 currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )
void currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous )  改變Item了
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 ()

 

 

 

#include <QtGui/QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTableWidget *tableWidget = new QTableWidget(10,5); // 構造了一個QTableWidget的對象,並且設置爲10行,5列
    //    也可用下面的方法構造QTableWidget對象
    //    QTableWidget *tableWidget = new QTableWidget;
    //    tableWidget->setRowCount(10);     //設置行數爲10
    //    tableWidget->setColumnCount(5);   //設置列數爲5
    tableWidget->setWindowTitle("QTableWidget & Item");
    tableWidget->resize(350, 200);  //設置表格
    QStringList header;
    header<<"Month"<<"Description";
    tableWidget->setHorizontalHeaderLabels(header);
    tableWidget->setItem(0,0,new QTableWidgetItem("Jan"));
    tableWidget->setItem(1,0,new QTableWidgetItem("Feb"));
    tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));

    tableWidget->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));
    tableWidget->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));
    tableWidget->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));
    tableWidget->show();

    return a.exec();
}

一. 對QTableWidget本身的效果實現

1. 將表格變爲禁止編輯

在默認情況下,表格裏的字符是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,如果想禁止用戶的這種操作,讓這個表格對用戶只讀,可以這樣:

 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

 

QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚舉中的一個,都是觸發修改單元格內容的條件:

 

 

QAbstractItemView.NoEditTriggers

0

No editing possible. 不能對錶格內容進行修改

QAbstractItemView.CurrentChanged

1

Editing start whenever current item changes.任何時候都能對單元格修改

QAbstractItemView.DoubleClicked

2

Editing starts when an item is double clicked.雙擊單元格

QAbstractItemView.SelectedClicked

4

Editing starts when clicking on an already selected item.單擊已選中的內容

QAbstractItemView.EditKeyPressed

8

Editing starts when the platform edit key has been pressed over an item.

QAbstractItemView.AnyKeyPressed

16

Editing starts when any key is pressed over an item.按下任意鍵就能修改

QAbstractItemView.AllEditTriggers

31

Editing starts for all above actions.以上條件全包括

 

 

 

2. 設置表格爲整行選擇

tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);  //整行選中的方式

QAbstractItemView.SelectionBehavior枚舉還有如下類型

 

 

Constant

Value

Description

QAbstractItemView.SelectItems

0

Selecting single items.選中單個單元格

QAbstractItemView.SelectRows

1

Selecting only rows.選中一行

QAbstractItemView.SelectColumns

2

Selecting only columns.選中一列

 

 

 

3.單個選中和多個選中的設置:

tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);  //設置爲可以選中多個目標

該函數的參數還可以是:

QAbstractItemView.NoSelection      不能選擇

QAbstractItemView.SingleSelection  選中單個目標

QAbstractItemView.MultiSelection    選中多個目標

QAbstractItemView.ExtendedSelection   QAbstractItemView.ContiguousSelection 的區別不明顯,主要功能是正常情況下是單選,但按下Ctrl或Shift鍵後,可以多選

 

4. 表格表頭的顯示與隱藏

對於水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:

 tableWidget->verticalHeader()->setVisible(false);   //隱藏列表頭
 tableWidget->horizontalHeader()->setVisible(false); //隱藏行表頭

注意:需要 #include <QHeaderView>

 

5. 對錶頭文字的字體、顏色進行設置

    QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //獲得水平方向表頭的Item對象
    columnHeaderItem0->setFont(QFont("Helvetica")); //設置字體
    columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //設置單元格背景顏色
    columnHeaderItem0->setTextColor(QColor(200,111,30)); //設置文字顏色

注意:需要 #include <QHeaderView>

 

6. 在單元格里加入控件:

QTableWidget不僅允許把文字加到單元格,還允許把控件也放到單元格中。比如,把一個下拉框加入單元格,可以這麼做:

    QComboBox *comBox = new QComboBox();
    comBox->addItem("Y");
    comBox->addItem("N");
    tableWidget->setCellWidget(0,2,comBox);

二. 對單元格的進行設置

1. 單元格設置字體顏色和背景顏色 及字體字符

    QTableWidgetItem *item = new QTableWidgetItem("Apple");
    item->setBackgroundColor(QColor(0,60,10));
    item->setTextColor(QColor(200,111,100));
    item->setFont(QFont("Helvetica"));
    tableWidget->setItem(0,3,item);

另:如果需要對所有的單元格都使用這種字體,則可以使用  tableWidget->setFont(QFont("Helvetica"));

2. 設置單元格內文字的對齊方式

這個比較簡單,使用newItem.setTextAlignment()函數即可,該函數的參數爲單元格內的對齊方式,和字符輸入順序是自左相右還是自右向左。

水平對齊方式有:

 

 

Constant Value Description
Qt.AlignLeft 0x0001 Aligns with the left edge.
Qt.AlignRight 0x0002 Aligns with the right edge.
Qt.AlignHCenter 0x0004 Centers horizontally in the available space.
Qt.AlignJustify 0x0008 Justifies the text in the available space.

 

 

垂直對齊方式:

 

 

Constant Value Description
Qt.AlignTop 0x0020 Aligns with the top.
Qt.AlignBottom 0x0040 Aligns with the bottom.
Qt.AlignVCenter 0x0080 Centers vertically in the available space.

 

 

如果兩種都要設置,只要用 Qt.AlignHCenter |  Qt.AlignVCenter 的方式即可

 

3. 合併單元格效果的實現:

tableWidget->setSpan(0, 0, 3, 1)  # 其參數爲: 要改變單元格的   1行數  2列數     要合併的  3行數  4列數

 

4. 設置單元格的大小

首先,可以指定某個行或者列的大小

    tableWidget->setColumnWidth(3,200);
    tableWidget->setRowHeight(3,60);

還可以將行和列的大小設爲與內容相匹配

    tableWidget->resizeColumnsToContents();
    tableWidget->resizeRowsToContents();

5. 獲得單擊單元格的內容

通過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就可以獲得鼠標單擊到的單元格指針,進而獲得其中的文字信息

connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(getItem(QTreeWidgetItem*,int)));

//將itemClicked信號與函數getItem綁定



6.QTableWidget要調整表格行寬主要涉及以下一個函數

resizeColumnsToContents();                      根據內容調整列寬          
resizeColumnToContents(int col);               根據內容自動調整給定列寬
horizontalHeader()->setResizeMode
           把給定列設置爲給定模式
主要模式有Stretch和Fixed

7.

int row = rowCount();
 removeRow(row);//清除已有的行列
 setShowGrid(true);//顯示錶格線
 verticalHeader()->setVisible(false);//隱藏左邊垂直
 QHeaderView *headerView = horizontalHeader();
 headerView->setMovable(false);//去除表頭的移動
 headerView->resizeSection(0,284);//設置第一列寬
 headerView->resizeSection(1,127);//設置第二列寬
 headerView->setResizeMode(QHeaderView::Fixed);//列表不能移動
 headerView->setClickable(false);//不響應鼠標單擊
 setEditTriggers(QTableWidget::NoEditTriggers);//不能編輯
 setSelectionBehavior(QTableWidget::SelectRows);//一次選中一行
 setSelectionMode(QAbstractItemView::SingleSelection);//只能單選
 /*QScrollBar *scrollBar = horizontalScrollBar();
 scrollBar->hide();*/
 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水平滾動條
 setVerticalScrollMode(QAbstractItemView::ScrollPerItem);//垂直滾動條按項移動
 setAutoScroll(false);//去掉自動滾動

http://mrjake.blog.163.com/blog/static/10510910620129297544967








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章