ПУСТО

пятница, 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());
}

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. На эту тему: Как в QTextEdit добавить элемент в контекстное меню?
    1) Наследуя

    void MyTextEdit::contextMenuEvent(QContextMenuEvent *event)
    {
    QMenu *menu = createStandardContextMenu();
    menu->addAction(tr("My Menu Item"));
    //...
    menu->exec(event->globalPos());
    delete menu;
    }

    2) С обработчиком через сигнал

    В конструкторе:
    /-------------------------------------------------------------------
    ui.textEdit_Data->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui.textEdit_Data,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(slotShowContextMenu_textEdit_Data(const QPoint &)));

    void MainWindow::slotShowContextMenu_textEdit_Data(const QPoint &p)
    {
    QMenu * menu = ui.textEdit_Data->createStandardContextMenu();
    menu->addSeparator();
    menu->addAction(tr("Загрузить"));
    menu->addAction(tr("Сохранить"));
    menu->exec(ui.textEdit_Data->mapToGlobal(p));
    delete menu;
    }

    ОтветитьУдалить