ПУСТО

пятница, 2 октября 2015 г.

Qt - контекстное меню для виджетов

Можно наследовать виджет и переопределить виртуальную функцию

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
protected:
virtual void contextMenuEvent(QContextMenuEvent * event);
...
 
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
    QMenu menu(this);
    menu.addAction(QPixmap("C:\\Qt\\pro\\popupmenu-build-desktop\\debug\\ico.png"), "ShowMessage", this, SLOT(msg()));
    menu.addAction("About Qt", qApp, SLOT(aboutQt()));
    menu.addSeparator();
    menu.addAction("Exit", qApp, SLOT(qApp->exit()));
    menu.exec(event->globalPos());
}

Можно подобно, через QAction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
protected:
virtual void contextMenuEvent(QContextMenuEvent * event);
...
 
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
  QMenu * menu = new QMenu();
 
  if (bTheOpen)
  {
   QAction * ActOpenBrowser=new QAction(tr("Открыть в браузере"), menu);
   ActOpenBrowser->setStatusTip(tr("Это подсказка в StatusBar"));
   ActOpenBrowser->setIcon(QIcon(":/myprog/icons/32_browser.png"));
   connect(ActOpenBrowser,SIGNAL(triggered()),this,SLOT(slotOpenBrowser()));
   menu->addAction(ActOpenBrowser);
  
  if (!menu->isEmpty())
  {
   menu->exec(event->globalPos());
  }
  delete menu
}

Можно прицепить меню, к уже существующему виджету, не наследуя его
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QApplication>
#include <QLineEdit>
#include <QAction>
 
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 QLineEdit le;
 le.show();
 le.addAction(new QAction(QObject::tr("qwe"),&le));
 le.addAction(new QAction(QObject::tr("asd"),&le));
 le.setContextMenuPolicy(Qt::ActionsContextMenu);
  
 return a.exec();
}

Есть еще вариант того же, но с обработчиком контекстного меню, через сигнал
В приведенном ниже примере, в классе TabWidget (наследнике от QTabWidget) устанавливается контекстное меню на ярлыки вкладок (на элемент QTabBar)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TabWidget::TabWidget(QWidget * parent):QTabWidget(parent)
{
ActClose = new QAction(tr("Close"),this);
connect(ActClose,SIGNAL(triggered()),this,SLOT(slotClose()));
QTabBar * tb=tabBar();
tb->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tb, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(slotShowContextMenuTabBar(const QPoint &)));
}
 
void TabWidget::slotShowContextMenuTabBar(const QPoint &point)
{
    if (point.isNull()) return;
    QTabBar * tb=tabBar();
    int tabIndex = tb->tabAt(point); // Индекс - на какой вкладке вызвали меню
  
    if (tabIndex!=currentIndex()) setCurrentIndex(tabIndex);
 
 QMenu menu(this);
 menu.addAction(ActClose);
  
 menu.exec(tb->mapToGlobal(point));
}
void TabWidget::slotClose(void)
{
 removeTab(currentIndex());
}