文章目錄
最近QT用了一下QTableWidget,有必要記錄一下,方便以後查閱
QTableWidget與QTableView的區別
QTableWidget是一種列表視圖,與此類似的還有QTableView
QTableWidget是QTableView的子類,主要的區別是QTableView可以使用自定義的數據模型來顯示內容(也就是先要通過setModel來綁定數據源),而QTableWidget則只能使用標準的數據模型,並且其單元格數據是QTableWidgetItem的對象來實現的(也就是不需要數據源,將逐個單元格內的信息填好即可)。這主要體現在QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,整個表格都需要用逐個單元格構建起來。
QTableWidget基本使用
將表格設置爲禁止編輯
默認情況下,表格內容是可以編輯的,可以通過以下方式,禁止修改表格內容
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
/*
其它枚舉選項如下
QAbstractItemView::NoEditTriggers 0 不能對錶格內容進行修改
QAbstractItemView::CurrentChanged 1 任何時候都能對單元格修改
QAbstractItemView::DoubleClicked 2 雙擊單元格
QAbstractItemView::SelectedClicked 4 單擊已選中的內容
QAbstractItemView::EditKeyPressed 8 編輯按鈕按下
QAbstractItemView::AnyKeyPressed 16 按下任意鍵就能修改
QAbstractItemView::AllEditTriggers 31 以上條件全包括
*/
設置表格爲整行選擇
設置表格列頭
QStringList headerList;
headerList << "name" << "age" << "grade" << "score";
tableWidget->setColumnCount(headerList .size());
tableWidget->setHorizontalHeaderLabels(headerList );
默認情況下,表格是可以按照單元格選擇的,可以通過以下方式設置正行選擇
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式
表格表頭的顯示與隱藏
tableWidget->verticalHeader()->setVisible(true); //顯示列表頭
tableWidget->horizontalHeader()->setVisible(true); //顯示行表頭
tableWidget->verticalHeader()->setStyleSheet("QHeaderView::section{background:skyblue}");
tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignLeft);
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue}");
tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
設置間隔行底色
tableWidget->setAlternatingRowColors(true);
設置表頭內容自適應
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); 自適應列寬
tableWidget->verticalHeader()->setResizeMode(QHeaderView::Stretch); 自適應行高
設置自動拉伸
tableWidget->horizontalHeader()->setStretchLastSection(true);
動態增加行
int rowCnt = tableWidget->rowCount();
tableWidget->insertRow(rowCnt);
設置滾動條風格
tableWidget->verticalScrollBar()->setStyleSheet("QScrollBar:vertical{" //垂直滑塊整體
"background:#FFFFFF;" //背景色
"padding-top:20px;" //上預留位置(放置向上箭頭)
"padding-bottom:20px;" //下預留位置(放置向下箭頭)
"padding-left:3px;" //左預留位置(美觀)
"padding-right:3px;" //右預留位置(美觀)
"border-left:1px solid #d7d7d7;}"//左分割線
"QScrollBar::handle:vertical{"//滑塊樣式
"background:#dbdbdb;" //滑塊顏色
"border-radius:6px;" //邊角圓潤
"min-height:80px;}" //滑塊最小高度
"QScrollBar::handle:vertical:hover{"//鼠標觸及滑塊樣式
"background:#d0d0d0;}" //滑塊顏色
);
tableWidget->horizontalScrollBar()->setStyleSheet("QScrollBar:vertical{" //垂直滑塊整體
"background:#FFFFFF;" //背景色
"padding-top:20px;" //上預留位置(放置向上箭頭)
"padding-bottom:20px;" //下預留位置(放置向下箭頭)
"padding-left:3px;" //左預留位置(美觀)
"padding-right:3px;" //右預留位置(美觀)
"border-left:1px solid #d7d7d7;}"//左分割線
"QScrollBar::handle:vertical{"//滑塊樣式
"background:#dbdbdb;" //滑塊顏色
"border-radius:6px;" //邊角圓潤
"min-height:80px;}" //滑塊最小高度
"QScrollBar::handle:vertical:hover{"//鼠標觸及滑塊樣式
"background:#d0d0d0;}" //滑塊顏色
);
單元格加入控件
QComboBox *comBox = new QComboBox();
comBox->addItem("Y");
comBox->addItem("N");
tableWidget->setCellWidget(row,column,comBox);
QTableWidget爲增加右鍵菜單
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tableWidget, SIGNAL(customContextMenuRequested(const QPoint &)),this,
SLOT(showRightClickContextMenu(const QPoint &)));
showRightClickContextMenu即爲顯示右鍵菜單的函數,可在此函數中創建自定義的右鍵菜單
void showRightClickContextMenu(const QPoint &point){
QMenu tblRightClickMenu;
QAction *m1 = new QAction("xxx1", &tblRightClickMenu);
QAction *m2 = new QAction("xxx2", &tblRightClickMenu);
QAction *m3 = new QAction("xxx3", &tblRightClickMenu);
connect(m1 , SIGNAL(triggered(bool)),this, SLOT(xxx1Process()));
tblRightClickMenu.exec(QCursor::pos());
}
添加右鍵菜單處理的完整示例
頭文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTableWidget>
#include <QHBoxLayout>
#include <QPoint>
#include <QModelIndex>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
QTableWidget *tableWidget;
QHBoxLayout* testLayout;
QModelIndex rightClickIndex;
private slots:
void showRightClickContextMenu(const QPoint&);
void action1RightClickSlot();
void action2RightClickSlot();
void action3RightClickSlot();
};
#endif // WIDGET_H
widget代碼
#include <QString>
#include <QStringList>
#include <QHeaderView>
#include <QScrollBar>
#include <QComboBox>
#include <QMenu>
#include <QAction>
#include <QDebug>
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
testLayout = new QHBoxLayout(this);
tableWidget = new QTableWidget(this);
QStringList headerList;
headerList << "name" << "sex" << "age" << "grade" << "score" << "combox";
tableWidget->setColumnCount(headerList .size());
tableWidget->setHorizontalHeaderLabels(headerList);
tableWidget->setStyleSheet(QStringLiteral("alternate-background-color:rgb(240, 255, 255)"));
tableWidget->setAlternatingRowColors(true);
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
// tableWidget->setStyleSheet(QStringLiteral("selection-background-color:rgb(240, 255, 255)"));
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue}");
tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
tableWidget->verticalHeader()->setStyleSheet("QHeaderView::section{background:skyblue}");
tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignLeft);
tableWidget->horizontalHeader()->setStretchLastSection(true);
tableWidget->setAlternatingRowColors(true);
tableWidget->verticalHeader()->setVisible(true); //顯示列表頭
tableWidget->horizontalHeader()->setVisible(true); //顯示行表頭
for(int i = 0; i < 100; i++)
{
tableWidget->insertRow(i);
tableWidget->setItem(i, 0, new QTableWidgetItem(QString("xxx") + QString::number(i)));
tableWidget->setItem(i, 1, new QTableWidgetItem(QString("yyy") + QString::number(i)));
tableWidget->setItem(i, 2, new QTableWidgetItem(QString("zzz") + QString::number(i)));
tableWidget->setItem(i, 3, new QTableWidgetItem(QString("kkk") + QString::number(i)));
tableWidget->setItem(i, 4, new QTableWidgetItem(QString("mmm") + QString::number(i)));
QComboBox *comBox = new QComboBox();
comBox->addItem("Y");
comBox->addItem("N");
tableWidget->setCellWidget(i,5,comBox);
}
tableWidget->verticalScrollBar()->setStyleSheet("QScrollBar:vertical{" //垂直滑塊整體
"background:#FFFFFF;" //背景色
"padding-top:20px;" //上預留位置(放置向上箭頭)
"padding-bottom:20px;" //下預留位置(放置向下箭頭)
"padding-left:3px;" //左預留位置(美觀)
"padding-right:3px;" //右預留位置(美觀)
"border-left:1px solid #d7d7d7;}"//左分割線
"QScrollBar::handle:vertical{"//滑塊樣式
"background:#dbdbdb;" //滑塊顏色
"border-radius:6px;" //邊角圓潤
"min-height:80px;}" //滑塊最小高度
"QScrollBar::handle:vertical:hover{"//鼠標觸及滑塊樣式
"background:#d0d0d0;}" //滑塊顏色
);
tableWidget->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal{"
"background:#FFFFFF;"
"padding-top:3px;"
"padding-bottom:3px;"
"padding-left:20px;"
"padding-right:20px;}"
"QScrollBar::handle:horizontal{"
"background:#dbdbdb;"
"border-radius:6px;"
"min-width:80px;}"
"QScrollBar::handle:horizontal:hover{"
"background:#d0d0d0;}"
);
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tableWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showRightClickContextMenu(const QPoint&)));
testLayout->addWidget(tableWidget);
setLayout(testLayout);
}
Widget::~Widget()
{
}
void Widget::showRightClickContextMenu(const QPoint &point)
{
QMenu menu;
QAction *action1 = new QAction(tr("信息1"), &menu);
QAction *action2 = new QAction(tr("信息2"), &menu);
QAction *action3 = new QAction(tr("信息3"), &menu);
menu.addAction(action1);
menu.addAction(action2);
menu.addAction(action3);
connect(action1, SIGNAL(triggered()), this, SLOT(action1RightClickSlot()));
connect(action2, SIGNAL(triggered()), this, SLOT(action2RightClickSlot()));
connect(action3, SIGNAL(triggered()), this, SLOT(action3RightClickSlot()));
rightClickIndex = tableWidget->indexAt(point);
if(rightClickIndex.isValid())
{
menu.exec(QCursor::pos());
}
}
void Widget::action1RightClickSlot()
{
int row = rightClickIndex.row();
int column = rightClickIndex.column();
qDebug() <<"row:" << row+1 << "column:" << column+1 << "action1 clicked!!";
}
void Widget::action2RightClickSlot()
{
int row = rightClickIndex.row();
int column = rightClickIndex.column();
qDebug() <<"row:" << row+1 << "column:" << column+1 << "action2 clicked!!";
}
void Widget::action3RightClickSlot()
{
int row = rightClickIndex.row();
int column = rightClickIndex.column();
qDebug() <<"row:" << row+1 << "column:" << column+1 << "action3 clicked!!";
}
剩下的以後使用中在摸索吧。