...void TableView::setModel(QAbstractItemModel* model){ QTableView::setModel(model); QSignalMapper* signalMapper = new QSignalMapper(this); for(int i = 0; i < model->columnCount(); i++) { QAction* action = new QAction(model->headerData(i, Qt::Horizontal).toString(), this); action->setCheckable(true); action->setChecked(!isColumnHidden(i)); action->setData(i); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); signalMapper->setMapping(action, action); horizontalHeader()->addAction(action); } connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(showHideColumnsMenuTriggered(QObject*))); horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);}...void TableView::showHideColumnsMenuTriggered(QAction* action){ setColumnHidden(action->data().toInt(), !action->isChecked());}//данный слот для совместимости с сигналмапперомvoid TableView::showHideColumnsMenuTriggered(QObject* obj){ QAction* action = qobject_cast<QAction*>(obj); if(action) showHideColumnsMenuTriggered(action);}...
QHeaderView * head = horizontalHeader(); connect(head, SIGNAL(sectionClicked(int)), this, SLOT(sectionClicked(int)));
if(logicalIndex == Observer::MenuTerminalSection){ QMenu menuSection(tr("Columns"), this); QHeaderView * head = horizontalHeader(); int c = head->count(); for(int i=0;i<c;++i){ if(i == Observer::MenuTerminalSection){ continue; } QAction * action = menuSection.addAction(model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); action->setCheckable(true); action->setChecked(!head->isSectionHidden(i)); action->setData(i); } QAction * action = menuSection.exec(QCursor::pos()); if(action){ int index = action->data().toInt(); head->setSectionHidden(index, !action->isChecked()); if(action->isChecked()) resizeColumnToContents(index); } }
////service.cpp//#include "service.h"#include <QMessageBox>QMenu *MenuForHeaderView::createMenu(QWidget *parent, QSqlRelationalTableModel *model, QTableView *view) { QMenu *columnsMenu= new QMenu(tr("Колонки")); columnsMenu->setIcon(QIcon(":images/images/configure.png")); QSignalMapper* signalMapper = new QSignalMapper(parent); for (int i = 0; i < model->columnCount(); i++) { QAction* action = new QAction(model->headerData(i, Qt::Horizontal).toString(), view); action->setCheckable(true); action->setChecked(!view->isColumnHidden(i)); action->setData(i); signalMapper->setMapping(action, action); connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); columnsMenu->addAction(action); } connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(showHideColumnsMenuTriggered(QObject*))); v = new QTableView; v=view; return columnsMenu;}void MenuForHeaderView::showHideColumnsMenuTriggered(QAction* action) { v->setColumnHidden(action->data().toInt(), !action->isChecked()); v->resizeColumnsToContents();}//данный слот для совместимости с сигналмапперомvoid MenuForHeaderView::showHideColumnsMenuTriggered(QObject* obj) { QAction* action = qobject_cast<QAction*>(obj); if (action) showHideColumnsMenuTriggered(action);}
////service.h//#ifndef __SERVICE_H__#define __SERVICE_H__#include <QtGui>#include <QtSql>class MenuForHeaderView:public QObject { Q_OBJECTpublic:MenuForHeaderView(QObject *parent = 0): QObject(parent) {} QTableView *v; QMenu *createMenu(QWidget *parent=0, QSqlRelationalTableModel *model=0, QTableView *view=0);public slots: void showHideColumnsMenuTriggered(QAction* action); void showHideColumnsMenuTriggered(QObject* obj);};#endif // __SERVICE_H__
...//соответсвенно//QSqlRelationalTableModel *model, QTableView *tableView MenuForHeaderView *mm = new MenuForHeaderView(this); QMenu *headerMenu= new QMenu; tableView->horizontalHeader()->addAction(headerMenu->addMenu(mm->createMenu(this, model, View) )); tableView->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);...