QT之QTableWidget使用


最近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!!";
}

剩下的以後使用中在摸索吧。






































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