Russian Qt Forum
Сентябрь 28, 2024, 02:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Список доступных тулбаров  (Прочитано 5614 раз)
davladus
Гость
« : Июль 31, 2006, 12:11 »

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


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

P.S. пример приложения.
qtdir\examples\mainwindows\application
Записан
Asaphus_Expansus
Гость
« Ответ #1 : Июль 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
Гость
« Ответ #2 : Август 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
Гость
« Ответ #3 : Август 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
Гость
« Ответ #4 : Август 30, 2006, 14:04 »

Думаю, что это плохой вариант. При нажатии на контекстном меню объекты тулбаров не разрушаются. Просто им вызывается слот hide().

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

, а за тем сделать нужному show()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 21.