QTableWidget添加表頭菜單 並 可以通過表頭菜單隱藏選中列


一、首先需要給QTableWidget安裝事件

二、重新實現eventFilter(QObject *obj, QEvent *ev)函數

三、下面是實現代碼

.h

#ifndef TABLEHEADERMENU_H
#define TABLEHEADERMENU_H

#include <QtWidgets/QMainWindow>
#include "ui_tableheadermenu.h"
#include <QStringList>
#include <QMenu>
#include <QEvent>

class TableHeaderMenu : public QMainWindow
{
    Q_OBJECT

public:
    TableHeaderMenu(QWidget *parent = 0);
    ~TableHeaderMenu();

    //設置表頭菜單
    void setHeaderMenu();

public slots:
    //表頭菜單響應槽函數
    void  slotVisibleItemsChanged(bool checked);

protected:
    //重寫事件
    bool eventFilter(QObject *obj, QEvent *ev);

private:
    Ui::TableHeaderMenuClass ui;

    //水平表頭
    QStringList horHeaderStr; 

    //表頭菜單
    QMenu *m_headerMenu;
};

#endif // TABLEHEADERMENU_H

cpp

#include "tableheadermenu.h"
#include <QContextMenuEvent>

TableHeaderMenu::TableHeaderMenu(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    //設置列數
    ui.tableWidget->setColumnCount(5);
    //表頭
    horHeaderStr << QString::fromLocal8Bit("姓名")
                              << QString::fromLocal8Bit("年齡")
                              << QString::fromLocal8Bit("性別")
                              << QString::fromLocal8Bit("興趣")
                              << QString::fromLocal8Bit("特長");
    //設置表頭                            
    ui.tableWidget->setHorizontalHeaderLabels(horHeaderStr);

    //安裝水平表頭事件
    ui.tableWidget->horizontalHeader()->installEventFilter(this);
    
    setHeaderMenu();
}

TableHeaderMenu::~TableHeaderMenu()
{

}

/*
    實現表頭菜單
*/
void TableHeaderMenu::setHeaderMenu()
{
    m_headerMenu = new QMenu(this);

    QAction *actionName = new QAction(QString::fromLocal8Bit("姓名"), this);
    QAction *actionAge = new QAction(QString::fromLocal8Bit("年齡"), this);
    QAction *actionSex = new QAction(QString::fromLocal8Bit("性別"), this);
    QAction *actionInterset = new QAction(QString::fromLocal8Bit("興趣"), this);
    QAction *actionSpeciality = new QAction(QString::fromLocal8Bit("特長"), this);

    actionName->setObjectName(QString::number(0));        //0隱藏第一列
    actionName->setCheckable(true);
    actionName->setChecked(true);

    actionAge->setObjectName(QString::number(1));            //1隱藏第二列
    actionAge->setCheckable(true);
    actionAge->setChecked(true);

    actionSex->setObjectName(QString::number(2));            //2隱藏第三列
    actionSex->setCheckable(true);
    actionSex->setChecked(true);

    actionInterset->setObjectName(QString::number(3));    //3隱藏第四列
    actionInterset->setCheckable(true);
    actionInterset->setChecked(true);

    actionSpeciality->setObjectName(QString::number(4));//4隱藏第五列
    actionSpeciality->setCheckable(true);
    actionSpeciality->setChecked(true);

    //連接菜單響應槽函數
    connect(actionName, &QAction::toggled, this, &TableHeaderMenu::slotVisibleItemsChanged);
    connect(actionAge, &QAction::toggled, this, &TableHeaderMenu::slotVisibleItemsChanged);
    connect(actionSex, &QAction::toggled, this, &TableHeaderMenu::slotVisibleItemsChanged);
    connect(actionInterset, &QAction::toggled, this, &TableHeaderMenu::slotVisibleItemsChanged);
    connect(actionSpeciality, &QAction::toggled, this, &TableHeaderMenu::slotVisibleItemsChanged);

    //添加菜單
    m_headerMenu->addAction(actionName);
    m_headerMenu->addAction(actionAge);
    m_headerMenu->addAction(actionSex);
    m_headerMenu->addAction(actionInterset);
    m_headerMenu->addAction(actionSpeciality);
}

/*
    表頭菜單響應函數
*/
void TableHeaderMenu::slotVisibleItemsChanged(bool checked)
{
    QObject *obj = dynamic_cast<QObject *>(sender());
    int n = obj->objectName().toInt();
    ui.tableWidget->setColumnHidden(n, !checked);
}

/*
    重寫事件
*/
bool TableHeaderMenu::eventFilter(QObject *obj, QEvent *ev)
{
    if (obj == ui.tableWidget->horizontalHeader()){
        if (ev->type() == QEvent::ContextMenu){
            QContextMenuEvent *menuEvent = static_cast<QContextMenuEvent *>(ev);
            m_headerMenu->popup(menuEvent->globalPos());
            return true;
        }
        else{
            return false;
        }
    }
    else{
        return eventFilter(obj, ev);
    }

}

main

#include "tableheadermenu.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TableHeaderMenu w;
    w.show();
    return a.exec();
}

效果圖

 

 出處:https://www.cnblogs.com/jiangson/p/9119410.html


免責聲明!

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



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