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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMenu submenu  (Прочитано 5867 раз)
kompotFX
Гость
« : Май 11, 2010, 21:38 »

создал контекстное меню не привязанное к тулбару, оно срабатывает (вызывается акция и закрывается) нa нaжaтиe любой кнопки мыши (левой, правой). Хoчу сделать чтoбы на правую кнопку срабатывала акция (triggered) кaк обычно, а на правую кнопку я отрабaтывал свою функцию.
Ну я сделал свой подклaсс  от QMenu, перeопределил mousePressEvent(), перехватываю нaжатия кнопок без проблем. Проблема возникла когда я создаю для этого меню свое под-меню:

Код:
iMenu = new MyMenu(this); // мое контекстное меню
iMenu->addAction(name, this, SLOT(onActionOpen())); //ok, все работает, ..и нажатие кнопок мыши
iSubmenu = static_cast<MyMenu*> (iMenu->addMenu(name2));
iSubmenu->addAction(name3, this, SLOT(onActionOpen())); //акция работает, нажатие кнопок мыши нет

переопрeделенный метод:
Код:

void MyMenu::mousePressEvent(QMouseEvent* ev)
{
    if(ev->type() == QEvent::MouseButtonPress)
    {
if (ev->button() == Qt::LeftButton)
{
    QMenu::mousePressEvent(ev);
}
         else if (ev->button() == Qt::RightButton)
{
             //мой код для правой кнопки здесь
}
    }
}

Что делаю не так? Как захватить нажатие мыши для под-меню?
Записан
jack_r
Гость
« Ответ #1 : Май 11, 2010, 21:48 »

Код:
iSubmenu = static_cast<MyMenu*> (iMenu->addMenu(name2));
Объект какого типа возвращает функция MyMenu::addMenu()? И вообще эта функция переопределёна?
Записан
kompotFX
Гость
« Ответ #2 : Май 11, 2010, 22:00 »

addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?
Записан
nixman05
Гость
« Ответ #3 : Май 11, 2010, 22:10 »

addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?

попробуй при помощи qobject_cast<T>(obj)
Записан
kompotFX
Гость
« Ответ #4 : Май 11, 2010, 22:26 »

addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?

попробуй при помощи qobject_cast<T>(obj)

еще хуже, в этом случaе программа падает, т.к. qobject_cast == dynamic_cast я понимаю
Записан
nixman05
Гость
« Ответ #5 : Май 11, 2010, 23:13 »

addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?

попробуй при помощи qobject_cast<T>(obj)

еще хуже, в этом случaе программа падает, т.к. qobject_cast == dynamic_cast я понимаю


iSubmenu = qobject_cast<MyMenu*> (iMenu->addMenu(name2)); Именно здесь падает?

Записан
kompotFX
Гость
« Ответ #6 : Май 11, 2010, 23:23 »

addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?

попробуй при помощи qobject_cast<T>(obj)

еще хуже, в этом случaе программа падает, т.к. qobject_cast == dynamic_cast я понимаю
iSubmenu = qobject_cast<MyMenu*> (iMenu->addMenu(name2)); Именно здесь падает?
падает на след.строке потому что iSubmenu возвращается 0
Записан
jack_r
Гость
« Ответ #7 : Май 11, 2010, 23:32 »

Цитировать
А как переопределить addMenu коректно в таком случае?
Что-нибудь вроде этого (не проверял):
Код:
MyMenu *MyMenu::addMenu(const QString &name)
{
    MyMenu *menu = new MyMenu(name);
    return menu;
}

Код:
iSubmenu = qobject_cast<MyMenu*> (iMenu->addMenu(name2));
iSubmenu = static_cast<MyMenu*> (iMenu->addMenu(name2));
Если не переопределена функция addMenu(), то эти инструкции приведут к ошибки в любом случае, потому что в соответствии с преобразованием типов в ООП предка нельзя преобразовывать к потомку. В данном случае QMenu к MyMenu.

Возможное решение:
Код:
iMenu = new MyMenu(this); 
iMenu->addAction(name, this, SLOT(onActionOpen()));
iSubmenu = new MyMenu(name2);
iMenu->addMenu(iSubmenu);
iSubmenu->addAction(name3, this, SLOT(onActionOpen()));
« Последнее редактирование: Май 11, 2010, 23:36 от jack_r » Записан
kompotFX
Гость
« Ответ #8 : Май 12, 2010, 00:00 »

Нашел рeшение:
переопределил в MyMenu::addMenu()
Код:
MyMenu* MyMenu::addMenu(const QString& title)
{
    MyMenu* subMenu = new MyMenu(this);
    QAction* act = QMenu::addMenu(subMenu);
    act->setText(title);
    return subMenu;
}

теперь все работает.
Спасибо за подсказки jack_r, nixman05 !
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Май 12, 2010, 08:16 »

А кто мешал сделать так:
Код
C++ (Qt)
iSubmenu = new MyMenu(name2, this);
iMenu->addMenu(iSubmenu);
 
?
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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