Название: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 09:23 Основная форма в приложении. Из нее открываются другие окна. Индикацией, что данное окно уже открыто служит установленная галочка в меню основного окна и/или нажатая кнопка на основном окне.
В окне предка делал так: Код: void AbstractLogWindow::showEvent(QShowEvent *event) Где WinName - это как раз название класса окна - предка. Однако, qFindChild в окне родителе меню QAction с таким именем "m_" + m_WinName + "Menu" не находит, хотя оно точно есть. Вод код конструктора родителя: Код: MainForm::MainForm(QWidget *parent) : Вот это меню m_CalculatorWindowMenu и не находится. Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 10:14 Да и еще хотел бы уточнить такой момент: в конструкторе создается меню, тулбар:
Код: QAction* pact = m_pmnuWindows->addAction("Cascade", m_pws, SLOT(cascade())); Переменная pact - в данном случае локальная. И время жизни ее - только в пределах этой ф-ции. Правильно ли я понимаю, что в ф-йии addAction происходит копирование объекта типа QAction - ну иначе бы этот пункт меню бы уничтожился вместе с pact? Второе - за пределами конструктора как то можно обратиться к этому пункту меню - сделать его checked? Или для этого переменную pact нужно объявлять глобальной? Название: Re: У родителя сделать меню checked Отправлено: GreatSnake от Апрель 19, 2012, 10:22 Правильно ли я понимаю, что в ф-йии addAction происходит копирование объекта типа QAction - ну иначе бы этот пункт меню бы уничтожился вместе с pact? Нет не правильно, т.к. pact - это не копия, а адрес созданного в addAction объекта.Цитировать Второе - за пределами конструктора как то можно обратиться к этому пункту меню - сделать его checked? Или для этого переменную pact нужно объявлять глобальной? Почему обязательно глобальной? Сделай её членом класса и сделай метод её получения.Цитировать QAction *m = qFindChild<QAction *>(parent(), "m_" + m_WinName + "Menu"); Чтобы искать по имени, надо это имя задать через QObject::setObjectName().Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 15:55 Спасибо за ответы.
Пункты 1 и 2 - нет вопросов. А вот пункт 3 так и не заработал, хотя тоже спасибо - нашел в документации про setObjectName. Делал так. В конструкторе главного окна: Код: m_WindowMenu = new QMenu(tr("&Windows")); при открытии окна CalculatorWindow Код: void AbstractLogWindow::showEvent(QShowEvent *event) Ни первый, ни второй вариант с findChild почему то не прошли.. Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 16:11 Ага! Кажется подразобрался в чем причина - при проверке
Код: void AbstractLogWindow::showEvent(QShowEvent *event) Выяснилось, что Код: MainForm::MainForm(QWidget *parent) : m_CalculatorWindowMenu в children не содержится. Пока не понял, почему... Название: Re: У родителя сделать меню checked Отправлено: GreatSnake от Апрель 19, 2012, 16:16 QObject::children() возвращает ссылку на список непосредственных детей без "внуков" и "правнуков".
Цитировать m_WindowMenu = new QMenu(tr("&Windows")); И кстати, как ты можешь что-то найти, если ты создаёшь меню вообще без родителя.Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 16:19 Да, наследником является QMenuBar.
A QAction получается уже наследник QMenuBar. Сейчас попробую до него добраться ))) Название: Re: У родителя сделать меню checked Отправлено: GreatSnake от Апрель 19, 2012, 16:23 Да, наследником является QMenuBar. QMenuBar::addMenu( QMenu* menu ) не устанавливает родителя для menu.A QAction получается уже наследник QMenuBar. Сейчас попробую до него добраться ))) Т.е. у тебя нарушена иерархия объектов, поэтому ничего не находится. Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 16:42 Вот я чую, что само меню неправильно как то задаю, хотя вроде как все по книге делаю.
Работать то оно как и написано, работает, но вот что я не пойму - при addMenu я добавляю пункты меню верхнего уровня. Для добавления подменю в документации написано addAction... Но они не являются предками меню... Вариант конечно делать их public в классе и к ним напрямую обращаться... Название: Re: У родителя сделать меню checked Отправлено: Alex_C от Апрель 19, 2012, 17:07 В общем еще раз перечитал главу книги про меню, и понял, что надо делать не так - надо как раз передавать ссылку на QAction - потому как это может использоваться не только в меню, но и в ToolBar.
Название: Re: У родителя сделать меню checked Отправлено: Igors от Апрель 19, 2012, 17:45 Вот я чую, что само меню неправильно как то задаю, хотя вроде как все по книге делаю. В духе Qt испустить сигнал, а поймавший слот займется установкой галочкиРаботать то оно как и написано, работает, но вот что я не пойму - при addMenu я добавляю пункты меню верхнего уровня. Для добавления подменю в документации написано addAction... Но они не являются предками меню... Вариант конечно делать их public в классе и к ним напрямую обращаться... |