一、首先需要給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