本人在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