Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kompotFX от Май 11, 2010, 21:38



Название: QMenu submenu
Отправлено: 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)
{
             //мой код для правой кнопки здесь
}
    }
}

Что делаю не так? Как захватить нажатие мыши для под-меню?


Название: Re: QMenu submenu
Отправлено: jack_r от Май 11, 2010, 21:48
Код:
iSubmenu = static_cast<MyMenu*> (iMenu->addMenu(name2));
Объект какого типа возвращает функция MyMenu::addMenu()? И вообще эта функция переопределёна?


Название: Re: QMenu submenu
Отправлено: kompotFX от Май 11, 2010, 22:00
addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?


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

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


Название: Re: QMenu submenu
Отправлено: kompotFX от Май 11, 2010, 22:26
addMenu возвращает QMenu. Наверное в этом и прoблема. Компилятoр ругался, поэтoму и пришлось делaть static_cast.
А как переопределить addMenu коректно в таком случае?

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

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


Название: Re: QMenu submenu
Отправлено: nixman05 от Май 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)); Именно здесь падает?



Название: Re: QMenu submenu
Отправлено: kompotFX от Май 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


Название: Re: QMenu submenu
Отправлено: jack_r от Май 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()));


Название: Re: QMenu submenu
Отправлено: kompotFX от Май 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 !


Название: Re: QMenu submenu
Отправлено: GreatSnake от Май 12, 2010, 08:16
А кто мешал сделать так:
Код
C++ (Qt)
iSubmenu = new MyMenu(name2, this);
iMenu->addMenu(iSubmenu);
 
?