Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: davladus от Июль 31, 2006, 12:11



Название: Список доступных тулбаров
Отправлено: davladus от Июль 31, 2006, 12:11
Имеется приложение (qt 4.1.2) с меню и тулбарами. Если кликнуть правой
кнопкой на любом тулбаре появляется список доступных тулбаров с возможностью выбора тех которые вы желаете видеть.
Проблема в том, что если таким методом выключить все тулбары, то увидеть список досупных тулбаров  или включить какой либо из них  не возможно. Во многих приложения это проблема решается следующим способом - список появляется и при нажатии прав. кнопки на MenuBar.


Вопрос Как сделать так, чтобы такой список отображался  и при нажатии правой кнопки на MenuBar?

P.S. пример приложения.
qtdir\examples\mainwindows\application


Название: Список доступных тулбаров
Отправлено: Asaphus_Expansus от Июль 31, 2006, 18:03
1. Установить для MenuBar custom policy

    menuBar()->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(menuBar(), SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(abc(const QPoint &)));

2. Странслировать полученый сигнал до тулбара

void MainWindow::abc(const QPoint & p)
{
    QContextMenuEvent e(QContextMenuEvent::Other, p);
    QCoreApplication::sendEvent(fileToolBar, &e);
}


Название: Список доступных тулбаров
Отправлено: davladus от Август 07, 2006, 09:52
Такой метод работает если видим хотя бы один из тулбаров. Если его выключить все тулбары из списка видимых тулбаров, то метод не работает.  
Так что по-прежнему если
Цитировать

выключить все тулбары, то увидеть список досупных тулбаров или включить какой либо из них не возможно


добавлено спустя 26 минут:

 Спасибо за ответы,
я решил не искать лучшего в хорошем а просто создаю меню заново
когда это необходимо. Методику создания скопировал из  

QMenu *QMainWindow::createPopupMenu()

Код:


 // code to create context menu from MenuBar
  menuBar->setContextMenuPolicy(Qt::CustomContextMenu); // that line is very neccessary
  QObject::connect(menuBar, SIGNAL(customContextMenuRequested(const QPoint &)),
    this, SLOT(ContextMenuRequested(const QPoint &)));

 
...

void SomeClass::ContextMenuRequested(const QPoint &p)
{
  //QContextMenuEvent e(QContextMenuEvent::Other, p);
 // QCoreApplication::sendEvent(m_someToolbar, &e);

  QMenu *menu = 0;

  QList<QDockWidget *> dockwidgets = qFindChildren<QDockWidget *>(m_pMainWindow);
  if (dockwidgets.size()) {
    menu = new QMenu(m_pMainWindow);
    for (int i = 0; i < dockwidgets.size(); ++i)
      if (dockwidgets.at(i)->parentWidget() == m_pMainWindow)
        menu->addAction(dockwidgets.at(i)->toggleViewAction());
    menu->addSeparator();
  }
  QList<QToolBar *> toolbars = qFindChildren<QToolBar *>(m_pMainWindow);
  if (toolbars.size()) {
    if (!menu)
      menu = new QMenu(m_pMainWindow);
    for (int i = 0; i < toolbars.size(); ++i)
      if (toolbars.at(i)->parentWidget() == m_pMainWindow)
        menu->addAction(toolbars.at(i)->toggleViewAction());
  }

  menu->exec(p);

}


[/code]


Название: Список доступных тулбаров
Отправлено: davladus от Август 30, 2006, 13:38
А еще лучше так

Код:

// code to create context menu from MenuBar
  menuBar->setContextMenuPolicy(Qt::CustomContextMenu); // that line is very neccessary
  QObject::connect(menuBar, SIGNAL(customContextMenuRequested(const QPoint &)),
    this, SLOT(ContextMenuRequested(const QPoint &)));

...

/////////////////////////////////////////////////////////////////////////////
void MainWindow::ContextMenuRequested(const QPoint &p)
{
     QMenu *menu = this->createPopupMenu();
     menu->exec(mapToGlobal(p));
     delete menu;
}



Название: Список доступных тулбаров
Отправлено: bigirbis от Август 30, 2006, 14:04
Думаю, что это плохой вариант. При нажатии на контекстном меню объекты тулбаров не разрушаются. Просто им вызывается слот hide().

Попробуй найти все тулбары
Код:
findChildren < QToolBar * > ()

, а за тем сделать нужному show()