Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Spark от Июнь 13, 2013, 12:48



Название: Контекстное меню и QAction
Отправлено: Spark от Июнь 13, 2013, 12:48
Доброго времени суток всем!
Вот такой вопрос новичка.
Поставил на тулбар кнопку и определил действие для нее (вернее сказать, так устроена программа, которую я выбрал для экзекуции, потихоньку обучаясь):
Код:
  enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );

  Toolbar->widgetForAction( enBat )->setObjectName( "enButton" );

  connect( enBat, SIGNAL( toggled( bool ) ),
           this, SLOT( enToggled( bool ) ) );
        
Теперь необходимо задать контекстное меню для этой кнопки. И решить это в лоб не получилось:
Код:
  enBat->setContextMenuPolicy( Qt::CustomContextMenu );   
 
  connect( enBat, SIGNAL( customContextMenuRequested( const QPoint & ) ),
           this, SLOT( context( const QPoint & ) ) );

Ну и понятно дело не получилось. А как надо?
Т.е. примерно понимаю, что  надо добавить виджет а в него уже вставить это действие. Ставил кнопку на тулбар. Прописал:
Код:
  scButton = new QToolButton( Toolbar );
  scButton->setIcon( QIcon (":/icons/enbat.png") );
  scButton->setPopupMode( QToolButton::InstantPopup );
  scButton->addAction( enBat );
  scButton->setContextMenuPolicy( Qt::CustomContextMenu );

  Toolbar->addWidget(scButton);

  connect( scButton, SIGNAL( customContextMenuRequested( const QPoint & ) ),
           this, SLOT( context( const QPoint & ) ) );
Но эффект несколько иной. У этой кнопки появляется ниспадающее меню в котором можно нажать на кнопку.
А в оригинале enBat дает кнопку с триггерным эффектом вкл./выкл. Нужно точно такая же, но + контекстное меню.

В общем как быть?


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 13:27
попробуйте вместо:
Код:
scButton->setPopupMode( QToolButton::InstantPopup );
использовать другой режим, например "QToolButton::MenuButtonPopup", и выставьте для кнопки "setCheckable(true)"...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 14:13
попробуйте вместо:
Код:
scButton->setPopupMode( QToolButton::InstantPopup );
использовать другой режим, например "QToolButton::MenuButtonPopup", и выставьте для кнопки "setCheckable(true)"...
Спасибо! Сработало. Поскольку нет необходимости  меню по левой кнопке, то использовал "QToolButton::DelayedPopup". Однако есть проблемка. Маленький треугольничек в уголке кнопки все равно присутствует. И иногда как то срабатывает выпадающее меню по левому клику мыши (не контекстное, а кнопка QAction enBat). Как от этого избавится?


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 15:14
Чтобы не было треугольника внизу, не надо добавлять объект типа "QMenu" в методе "setMenu" кнопки...
Но тогда Вам надо будет самому реализовать обображение контекстного меню...

Поскриптум: Вам, наверное легче будет отнаследоваться от QToolButton и создать свою кнопку с контекстным меню (если его содержимое не меняется) или создать фильтр на событие "QEvent::ContextMenu", и присоединить его к объекту типа QToolButton...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 15:51
Спасибо за советы. Без них я бы еще долго разбирался.
В конечном итоге фактически переназначил все на новую кнопку. Работает.
Осталось только от самого QAction избавиться, за ненадобностью. Но если просто удаляю, то перестает все работать. Ладно, надеюсь самостоятельно разобраться на чем и где все завязано.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 16:04
Во вложении пример того, что выше написал...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 17:33
Спасибо почти все сделал. Но не дает покоя QAction enBat. Пока лишняя кнопка на тулбаре.
На нее завязано меню в трее:
Код:
trayIconMenu.addAction( enBat );
Можно ли как то по простому переназначить на scButton.
Извините если вопросы слишком просты. Но уже столько каши в голове после поисков ответов и метода проб и ошибок.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 17:59
Вместо того, чтобы в QToolBar сразу добавлять действие, можно сначала отдельно создать объект типа QAction, затем создать объект типа QToolButton, потом связать объект-действие с кнопкой (при помощи метода void QToolButton::setDefaultAction ( QAction * action ) [slot]) и меню в трее. А уже в QToolbar добавлять кнопку. Тогда у Вас не будет дублирования...

Поскриптум: сам не пробовал, но, по моему, должно работать...


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 13, 2013, 18:05
enBat технически не является кнопкой если что, это QAction. эту «кнопку» из тулбара всегда можно убрать — экшн от этого не перестанет работать.

в меню можно добавлять только QAction'ы, кнопки нельзя.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 18:35
enBat технически не является кнопкой если что, это QAction. эту «кнопку» из тулбара всегда можно убрать — экшн от этого не перестанет работать.

в меню можно добавлять только QAction'ы, кнопки нельзя.
Понимаю. Я для ясности описал, что мне мешает на тулбаре. Просто QAction на чем то завязан. И если я его просто убираю, то конечно кнопки не будет. Но и программа перестает работать. Если убрать иконку. То надпись остается. Если и ее убрать, то не компилируется. Ну в общем, что то недопонимаю.
С этим потом разберусь. Этот QAction удалил. В общем то на меню в трее было завязано и там пытаюсь связать меню уже с новой кнопкой.
И здесь конечно опять в лоб не получается:
Код:
  connect( trayIconMenu.addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) ), SIGNAL( triggered( bool )),
           this, SLOT( enToggled( bool ) ) );
Лишней кнопки уже нет конечно, но и новая кнопка в трее ни с чем не связана (не рабочая).


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 18:43
Вместо того, чтобы в QToolBar сразу добавлять действие, можно сначала отдельно создать объект типа QAction, затем создать объект типа QToolButton, потом связать объект-действие с кнопкой (при помощи метода void QToolButton::setDefaultAction ( QAction * action ) [slot]) и меню в трее. А уже в QToolbar добавлять кнопку. Тогда у Вас не будет дублирования...

Поскриптум: сам не пробовал, но, по моему, должно работать...
Спасибо. Будем пробовать. Уже почти все получилось. Вернее первоначальная задача выполнена. Сама по себе новая кнопка на тулбаре работает  и контекстное меню зацепил. Осталось связать новую кнопку везде где она фигурирует (вернее фигурирует прежний QAction) - В настройках и в трее. Хотя бы с треем связать. Но мозги кипят уже порядком :).
А вообще спасибо за реальную помощь. Вчера день потратил на то как вообще сделать контекстное меню для виджета. С этим справился. Читая форум и рыская по справке, все равно с малым опытом все вокруг да около переправлять чужие исходники.
Сегодня день потратил как QAction переделать для этой цели, прежде чем спросил совета. И небольшая подсказка как раз направила в нужное русло.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 18:47
Вместо того, чтобы в QToolBar сразу добавлять действие, можно сначала отдельно создать объект типа QAction, затем создать объект типа QToolButton, потом связать объект-действие с кнопкой (при помощи метода void QToolButton::setDefaultAction ( QAction * action ) [slot]) и меню в трее. А уже в QToolbar добавлять кнопку. Тогда у Вас не будет дублирования...

Поскриптум: сам не пробовал, но, по моему, должно работать...

Во вложении пример выше описанного...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 13, 2013, 19:47
Во вложении пример выше описанного...
Код:
Спасибо. Попробовал. Код для кнопки похудел:
  scButton = new QToolButton( navToolbar );
  scButton ->setDefaultAction( enBat );
  scButton ->setContextMenuPolicy( Qt::CustomContextMenu );
  Toolbar->addWidget( scButton );

  connect( scButton, SIGNAL( customContextMenuRequested( const QPoint & ) ),
           this, SLOT( context( const QPoint & ) ) );
Теперь связи все сохранились и в рабочем состоянии, поскольку все завязано на enBat.

Но на тулбаре две кнопки :). Будем разбираться.

P.S. Все таки в данном случае это не тот путь. Слишком много дополнительных связей получается. Переделать которые сложнее. Убираем иконку QAction - рушаться все связи.

С нуля такой вариант был бы не плох. А так не ясно, можно ли вообще убрать в этом случае иконку QAction безнаказанно с тулбара.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 13, 2013, 20:54
Или я чего-то не понимаю.....
Но всё-же, вместо вот этого куска кода:
Код:
enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );
Toolbar->widgetForAction( enBat )->setObjectName( "enButton" );
 connect( enBat, SIGNAL( toggled( bool ) ), this, SLOT( enToggled( bool ) ) );

Сделайте что-то типа:
Код:
QAction *enBat = new QAction(QIcon( ":/icons/enbat.png" ), tr( "En Bat" ));
QToolButton *scButton = new QToolButton( navToolbar );
scButton->setDefaultAction( enBat );
scButton->setContextMenuPolicy( Qt::CustomContextMenu );
Toolbar->addWidget( scButton );
и т.д.
Тогда у вас будет указатель на enBat, с которым Вы можете делать всё, что угодно...
И если делать, как в примере, то не будет второй кнопки с такой же функциональностью...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 05:19
Так вроде я примерно так и делаю. Хотя для меня может быть какая то разница не очевидна (не болmше месяца как вообще с C++ и Qt) которая имеет значение.
Там и без кнопки проблем хватает, но хотя бы с ней разобраться. Почему у меня их две на тулбаре?
Вот упростил свой код, который в листинге:
Код:
  enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );

  scButton = new QToolButton( Toolbar );
  scButton->setDefaultAction( enBat );
  Toolbar->addWidget( scButton );
Разве это не то же самое, что в ваших примерах?
Тулбар, Экшин и Кнопка декларированы в другом файле.
После этого на тулбаре появляется дублирующая кнопка (судя по логике так и должно было произойти).
Для трея это нормальная ситуация. Если Экшен и кнопка на одном тулбаре, то у меня пока не получается задуманный результат. Криво можно сделать - второй тулбар :). Но некрасиво.
Но возможно я не понимаю разницу между вашим примером и тем, что сделал я.

Вообще возможно публиковать Экшен без определения его в интерфейс? Пока писал эту строку до меня дошла разница между вашим и моим кодом :). Буду править.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 06:40
Честно говоря не особо понимаю разницу между этой:
Код:
  enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );
и этой:
Код:
  QAction *enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), Toolbar );
Записями.
Но с первой кнопка дублируется, со второй нет.
Во второй записи вы не прописали тулбар. Думал, что здесь и кроется причина, но без этого выдает ошибку. Однако, такая запись сработала как надо, даже если прописать тулбар.

Пока не все проблемы решены, но может быть ближе к желаемому результату :).


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 09:23
К сожалению чем дальше уходим от первоначального варианта тем больше проблем пока.
Для трея прописано:
Код:
trayIconMenu.addAction( enBat );
Может можно действовать через слот setDefaultAction кнопки scButton?
Извините, если выражаюсь не правильно. Но надеюсь, что меня поймут.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 10:14
 Spark, Вам всё-таки не мешало бы заглянуть в документацию по Qt (хотя бы по тем классам, с которыми Вы "возитесь"), благо она хорошо написана. И тогда, скорее всего, большинство вопросов отпадут сами собой... ;)


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 11:08
Spark, Вам всё-таки не мешало бы заглянуть в документацию по Qt (хотя бы по тем классам, с которыми Вы "возитесь"), благо она хорошо написана. И тогда, скорее всего, большинство вопросов отпадут сами собой... ;)
Спасибо за совет. Конечно же в справочник я смотрю. К сожалению пока, что во многих случаев фижу там фигу :). И без пояснения более опытных товарищей мне не обойтись.
Ваши примеры разобрал и использовал. Но вот одно цепляет другое и возникают новые вопросы. Т.е. первоначальный вопрос то решен. Но решение породило побочные проблемы.
Если использую это:
enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );
Все работает, но от фантомной иконки избавиться не удалось.
Если использую это:
QAction *enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), Toolbar );
То либо работает как надо либо вообще программа не запускается.
Проблема в следующем. Та программа которую разбираю не на столько уж проста. И этот Экшин используют другие функции, которые, в этом случае, его не видят на сколько я понял, хотя он заявлен в заголовочном файле. (ну может и в другом причина).
Кроме того на этом enBat->setVisible завязаны реакции других функций и конфигурационный файл. И это вызывает проблему.
Удалось избавиться от фантома и запустить кнопку, если все полностью переписать на новую кнопку и удалить этот  злополучный QAction. К сожалению, здесь свои минусы есть. Все что связано с этим экшеном не работает - Кнопка в трее и настройки конфигурации.
Извините, что сумбурно пояснил, но как мог :).
Ok! Ушел читать доки :).
А за информацию все равно спасибо. В общем то помогла и сдвинула с мертвой точки. Раньше не удавалось вообще запустить контекстное меню на этом экшене. Для других более простых примеров эти варианты подойдут (в программе есть и попроще кнопки, которые то же надо снабдить контекстом или действием по правой кнопке мыши).


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 11:46
когда не можешь внятно объяснить — рисуй. я, например, до сих пор не могу понять что у тебя за проблема с лишними кнопками.
Код
C++ (Qt)
enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );
создает экшн и явно добавляет его на тулбар (появляется кнопка). можно следующей строкой написать
Код
C++ (Qt)
Toolbar->removeAction(enBat);
и кнопка исчезнет с тулбара.
Код
C++ (Qt)
QAction *enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), Toolbar );
просто создает экшн и назначает родителем тулбар. родитель отвечает за удаление своих детей. обычно родителем для экшенов назначают this (основную форму).


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 12:21
когда не можешь внятно объяснить — рисуй. я, например, до сих пор не могу понять что у тебя за проблема с лишними кнопками.
Хорошо. Вы правы. Плохо поясняю.
Постараюсь по порядку.
В файле maiwindow.hh
Код:
QAction * enBat;
QToolButton * scButton;
В файле maiwindow.cc
Код:
  enBat = Toolbar->addAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ) );
  enBat->setCheckable( true );
Все как положено на тулбаре появляется кнопка. Дальше свистопляска.
Ниже прописываю кнопку:
Код:
  scButton = new QToolButton( Toolbar );
  scButton->setCheckable( true );
  scButton->setDefaultAction( enBat);

  Toolbar->addWidget( scButton);
Результат несколько не тот. На тулбаре уже две кнопки одинаково функционирующие. Нажимаю одну, срабатывает другая. Так и должно быть, но Экшен кнопка мне не нужна.

Если же код запишу так:
Код:
  QAction *enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), Toolbar );
  enBat->setCheckable( true );

  scButton = new QToolButton( Toolbar );
  scButton->setCheckable( true );
  scButton->setDefaultAction( enBat);

  Toolbar->addWidget( scButton);
То если посчастливится запустится. И на тулбаре одна нужная иконка. К сожалению проблем больше.

Надеюсь ясно пояснил проблему.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 12:22
когда не можешь внятно объяснить — рисуй. я, например, до сих пор не могу понять что у тебя за проблема с лишними кнопками.
Если я правильно понял, то Spark-у надо добавить дополнительную функциональность в виде контекстного меню для конкретной кнопки на toolbar-е, поэтому тут и появляется объект типа QToolbarButton...

Spark, Вы не используйте пример дословно. Если я правильно понял, то Вы в своём методе объявили новую переменную типа QAction с именем enBat. Если это так, то Вы просто в локальном блоке создали новую локальную переменную с таким же именем, а переменная - член класса осталась не проинициализированной (а это уже относится к синтаксису С++, а не к Qt). От этого могут возникнуть проблемы...
 ???



Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 12:30
Spark, Вы не используйте пример дословно. Если я правильно понял, то Вы в своём методе объявили новую переменную типа QAction с именем enBat. Если это так, то Вы просто в локальном блоке создали новую локальную переменную с таким же именем, а переменная - член класса осталась не проинициализированной (а это уже относится к синтаксису С++, а не к Qt). От этого могут возникнуть проблемы...
 ???
Я это понимаю и дословно не переписывал код. Переменную я опубликовал в заголовочном файле. В общем сделал так как описал выше. Но вот почему то когда в локальном блоке создал переменную, то она и работает как мне хотелось - кнопка одна (за исключением, что нарушил связи). А когда через заголовочный файл опубликовал, то связи работают и кнопка работает. Но вот от фантома не  избавился.
Извините если, что не так опять ляпнул. Описал как мог. Не привык я еще правильными терминами оперировать.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 12:35
Ну тогда смотрите, где у Вас ещё раз идёт создание или добавление этого действия, тут без исходников, видимо, не разобраться (по крайне мере, мне)...


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 12:35
В принципе есть рабочий вариант. И может быть более рационален. Когда просто создаю кнопку и переписываю все на нее. Она одна, включает то, что мне надо и работает с контекстным меню :). Надо только завяать на нее кнопку в трее. Наверное это проще.

Но хотелось бы понять, что же я не правильно делаю.


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 12:45
теперь вроде стало понятно.
Код
C++ (Qt)
enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), this );
 enBat->setCheckable( true );
 
 scButton = new QToolButton( Toolbar );
 scButton->setCheckable( true );
 scButton->setDefaultAction( enBat);
 
 Toolbar->addWidget( scButton);
вот так разве не получится то, что ты хочешь?


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 13:08
теперь вроде стало понятно.
Код
C++ (Qt)
enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), this );
 enBat->setCheckable( true );
 
 scButton = new QToolButton( Toolbar );
 scButton->setCheckable( true );
 scButton->setDefaultAction( enBat);
 
 Toolbar->addWidget( scButton);
вот так разве не получится то, что ты хочешь?
Спасибо. Возможно эта та строка которая мне нужна была:
Код:
enBat = new QAction( QIcon( ":/icons/enbat.png" ), tr( "En Bat" ), this );
На вид все работает, кнопка одна, в трее кнопка то же реагирует, контекст работает и вроде программа запускается без проблем. Сейчас постепенно добавлю недостающие строчки и если не будет вылетать то здорово.
Кстати, я пытался эту строку вписать. Но вот как раз тот вариант, когда смотришь в справочник и видишь фигу. Что то не допонимаю и не правильно пишу строку (компилятор ругался) и в результате отказался от правильного решения еще вчера. Советы наставника все таки бесценны. Огромное спасибо. Надеюсь сегодня уже справиться с одной кнопкой и оформить как надо. Затем перелопачу все кнопки.


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 13:32
Spark, Вы не используйте пример дословно. Если я правильно понял, то Вы в своём методе объявили новую переменную типа QAction с именем enBat. Если это так, то Вы просто в локальном блоке создали новую локальную переменную с таким же именем, а переменная - член класса осталась не проинициализированной (а это уже относится к синтаксису С++, а не к Qt). От этого могут возникнуть проблемы...
этот вариант уже ведь был описан перед этим, правда на словах. похоже, стоит подучить плюсы.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 15:50
Проверил. Вроде все работает теперь отлично.
Спасибо! Я снова счастлив и могу двигаться дальше :).
Можете считать меня совсем ленивым, но маленький штришок.
В оригинале иконка QAction enBat становилась невидимой, если в настройках программы отключить Экшин.
Делается это так:
Код:
enBat->setVisible( cfg.pref.set );
Кнопка же scButton ведет себя несколько иначе: мутнеет перестает функционировать.
Код:
scButton->setVisible( cfg.pref.set );
не особо помогает. Только при перезапуске исчезает/появляется.
Как связать Экшен с кнопкой в этом случае?


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 16:57
вешать на кнопку другой (аналогичный) экшн, иначе не получится

а зачем вообще экшн отключать?


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 18:03
Проверил. Вроде все работает теперь отлично.
Спасибо! Я снова счастлив и могу двигаться дальше :).
Можете считать меня совсем ленивым, но маленький штришок.
В оригинале иконка QAction enBat становилась невидимой, если в настройках программы отключить Экшин.
Делается это так:
Код:
enBat->setVisible( cfg.pref.set );
Кнопка же scButton ведет себя несколько иначе: мутнеет перестает функционировать.
Код:
scButton->setVisible( cfg.pref.set );
не особо помогает. Только при перезапуске исчезает/появляется.
Как связать Экшен с кнопкой в этом случае?

Отключать объект-действие нужно методом "setEnabled(bool)", а "setVisible(bool)" влияет на видимость...

PS: раз уж в программе используются действия, то надо стараться управления кнопками, которые связаны с этими действиями делать через объекты-действия (извиняюсь за каламбур)... Только надо правильные методы использовать для реализации задуманного... А про сохранение настроек программы при перезапуске почитайте про класс QSettings


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:07
вешать на кнопку другой (аналогичный) экшн, иначе не получится

а зачем вообще экшн отключать?
В оригинале в настройках программы - отключение этой функции как таковой вообще (так, что кнопка исчезает). Когда я еще ничего не умел, предлагал пересмотреть концепцию и сделать просто вкл/выкл. Но программист пояснил якобы эта функция может создать проблемы и по умолчанию она выключена. Я против подобного. И в принципе думаю не буду делать подобный преференс в настройках. В общем на сегодня, меня существующее решение устраивает.
Мало того, если кнопка нажата, то при перезапуске программы она выключается. И для того, что бы поменять ситуацию надо в преференсах включить - включить при запуске. Тогда наоборот - если выключить, то при перезапуске включится. Я умолял хотя бы поменять на галочку которая запоминала бы нажатие кнопочки. А по умолчанию эта функция была бы отключена, если уж так беспокоимся о пользователе.
В конечном итоге мне вообще надоело попрошайничать и я просто изучаю C++ и Qt и сделал уже больше за месяц, чем уговорами за год.
На сегодня вроде как могу переделать интерфейс так как считаю нужным и с точки зрения пользователя этой программой, а не как программист пользующийся ей не в полной мере.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:21
PS: раз уж в программе используются действия, то надо стараться управления кнопками, которые связаны с этими действиями делать через объекты-действия (извиняюсь за каламбур)... Только надо правильные методы использовать для реализации задуманного... А про сохранение настроек программы при перезапуске почитайте про класс QSettings
Спасибо за совет. Наверное скоро придется воспользоваться. А пока, используя полученную информацию, навешаю контекстное меню на кнопки. Программа страдает слишком глубоко закопанным функционалом, который должен быть по рукой и пользователь зачастую просто не знает о нем.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:31
Попутный вопрос. На тулбаре можно отключить или поменять вид точечного сепаратора?


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 18:38
Попутный вопрос. На тулбаре можно отключить или поменять вид точечного сепаратора?

Какого точечного сепаратора? Если между группами кнопок, то там вроде вертикальная черта (по крайней мере у меня на Windows и Kubuntu)... :-\


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 18:46
кнопки как такие не предполагают контекстного меню (меню, вызывающегося правой кнопкой мыши) в принципе. вот если у нее есть стрелочка вниз, тогда сразу понятно, что при нажатии на кнопку левой кнопкой мыши вылезет меню.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:51
кнопки как такие не предполагают контекстного меню (меню, вызывающегося правой кнопкой мыши) в принципе. вот если у нее есть стрелочка вниз, тогда сразу понятно, что при нажатии на кнопку левой кнопкой мыши вылезет меню.
Я понимаю. Просто изначально стоял вопрос навешивание контекстного меню на Экшин. На кнопку я разобрася относительно давно - позавчера :). Но в исходнике сплошные Экшены с иконками. Сейчас переделываю и дальше уже проще.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:55
Попутный вопрос. На тулбаре можно отключить или поменять вид точечного сепаратора?

Какого точечного сепаратора? Если между группами кнопок, то там вроде вертикальная черта (по крайней мере у меня на Windows и Kubuntu)... :-\
Ну может я не так это назвал. Большие точки (вертикальная полоска) с лева на тулбаре - за который тулбар тянуть.
Тулбар разделил на несколько частей.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 18:58
Кнопок не так уж и много. И для мня на сегодня самый простой способ организовать драг энд друп с помощью маленьких тулбарчиков :). Ну хотя бы на первых порах. Пока не научусь делать это более правильно. Хотя в данном случае, возможно это рациональнее.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 19:15
Следующая кнопка зума.
В оригинале три кнопки. Мне такая концепция крайне не нравится.
Нравится две концепции:
1 - Колесико над кнопкой: вперед/назад. ЛКМ - сброс на умолчание. Остается и для контекстного меню ПКМ.
2 - ЛКМ - увеличить. ПКМ - уменьшить. Средняя кнопка мыши в дефолт.
Оба варианта позволяют обойтись одной кнопкой вместо трех.

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


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 19:26
Следующая кнопка зума.
В оригинале три кнопки. Мне такая концепция крайне не нравится.
Нравится две концепции:
1 - Колесико над кнопкой: вперед/назад. ЛКМ - сброс на умолчание. Остается и для контекстного меню ПКМ.
2 - ЛКМ - увеличить. ПКМ - уменьшить. Средняя кнопка мыши в дефолт.
Оба варианта позволяют обойтись одной кнопкой вместо трех.

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

Рассмотрите вариант использования QComboBox, в котором можно задавать зум. Так реализовано в Winword и в других программах....


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 19:33
Рассмотрите вариант использования QComboBox, в котором можно задавать зум. Так реализовано в Winword и в других программах....
Типа ниспадающего меню. Возьму на заметку. Но не в моем вкусе. Хотя это мои предпочтения. Люблю - нажал и готово. Хотя может это с моей точки зрения удобно - привык. Не каждый пользователь догадается жать правой кнопкой мыши. Хотя вроде распространенная концепция зума. Но можно скомбенировать и попробовать использовать кнопку типа MenuButtonPopup.


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 19:40
Рассмотрите вариант использования QComboBox, в котором можно задавать зум. Так реализовано в Winword и в других программах....
Типа ниспадающего меню. Возьму на заметку. Но не в моем вкусе. Хотя это мои предпочтения. Люблю - нажал и готово. Хотя может это с моей точки зрения удобно - привык. Не каждый пользователь догадается жать правой кнопкой мыши. Хотя вроде распространенная концепция зума.

Во многих программах (особенно в различного рода редакторах) есть несколько способов изменения зума: через элементы меню и например, Ctrl + колесо мыши, но не над кнопкой, а над окном редактора (т.е. можно перехватывать события колеса мыши для вашей формы, в которой необходимо изменить зум)...


Название: Re: Контекстное меняю и QAction
Отправлено: kambala от Июнь 14, 2013, 19:44
Попутный вопрос. На тулбаре можно отключить или поменять вид точечного сепаратора?
через setMovable() можно отключить. начни уже читать документацию.
Сложно ли использовать Среднюю кнопку мыши?
wheelEvent. начни уже читать документацию.


Название: Re: Контекстное меняю и QAction
Отправлено: Spark от Июнь 14, 2013, 19:59
Попутный вопрос. На тулбаре можно отключить или поменять вид точечного сепаратора?
через setMovable() можно отключить. начни уже читать документацию.
Сложно ли использовать Среднюю кнопку мыши?
wheelEvent. начни уже читать документацию.
Я много чего попутно делаю. И документацию читаю. Но ведь надо ткнуть пальцем хотя бы, что читать. Ну не так просто новичку понять многие моменты. Интересны были бы преподаватели в школе или в вузах, которые постоянно твердили бы - ищи в гоогл или читай документацию, там все есть :). А зачем тогда вообще нужны наставники? Вроде как говорили уже об этом. Не так уж плохо продвинулся за четвертую неделю :). Может другие и быстрее, но я пока такими небольшими темпами с нуля :).
Спасибо за терпение и за то, что все таки отвечаете и учите нас уму разуму :).


Название: Re: Контекстное меняю и QAction
Отправлено: VPS от Июнь 14, 2013, 21:06
Я много чего попутно делаю. И документацию читаю. Но ведь надо ткнуть пальцем хотя бы, что читать. Ну не так просто новичку понять многие моменты. Интересны были бы преподаватели в школе или в вузах, которые постоянно твердили бы - ищи в гоогл или читай документацию, там все есть :). А зачем тогда вообще нужны наставники? Вроде как говорили уже об этом. Не так уж плохо продвинулся за четвертую неделю :). Может другие и быстрее, но я пока такими небольшими темпами с нуля :).
Спасибо за терпение и за то, что все таки отвечаете и учите нас уму разуму :).

Не буду говорить за всех, но я тоже постоянно чему-то учусь (как без этого в IT области). Да и программирование для меня - это хобби (правда, довольно-таки давно).
Всё пытаюсь перескочить на java (чтобы работу сменить), но через какое-то время обратно на с++ сползаю. :)
Но это так, мысли вслух...

Spark, в сети есть хорошие книги по Qt на русском, если у Вас их ещё нет (там всё доходчиво описано):
1. Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008
2. Макс Шлее - Qt 4.5. Профессиональное программирование на C++
3. А если хорошо поискать, то можно найти и вот эту: Qt. Профессиональное программирование. Разработка кроссплатформенных приложении на С++
Но для начала и первых друх хватит...



Название: Re: Контекстное меняю и QAction
Отправлено: lit-uriy от Июнь 15, 2013, 15:22
Интересно, а "меняю" когда-нибудь исправят на "меню" в заголовке темы?


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 05:48
Каждый раз когда уже думаешь, что вот теперь то точно справишься самостоятельно все равно каждый новый шаг дается с большим трудом чем ожидаешь.
Ответ конечно я ищу, но пока ищу и пробую методом проб и ошибок, все таки спрошу совет.
Собственно теперь надо разобраться с чекбоксами в меню. Не то, что бы не ясно как их делать с нуля. А как связать уже готовое?

Есть UI для mainwindow

Есть UI для preferences
Там записано:
  
Код
C++ (Qt)
ui.preLoad->setChecked( p.preLoad );

Как проще для кнопки тулбара (пункт меню кнопки) в mainwindow добавить этот чекбокс?
Надеюсь достаточно ясно пояснил ситуацию.
Не пинайте к справочникам. Ищу и не только там. Просто после вашей помощи все кажется намного проще, чем ожидаешь :). Пока ищу самостоятельно, может помощь и здесь придет.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 07:53
Т.е. я понимаю, что действовать надо примерно так:
Создаем пункт меню:
Код:
  itemMenu->addAction( &onLoad);

Сигнал в простейшем варианте:
Код:
  onLoad.setCheckable( true );
  onLoad.setChecked( cfg.preferences.onLoad);

  connect( &onLoad, SIGNAL( triggered() ),
           this, SLOT( trig() ) );

Все - чекбокс в меню появился.

Со слотом пока сложнее. Дальше уже не знаю, что писать в тело функции или где начать копать:
void MainWindow::trig()
{

}

И вообще правильным ли путем пошел? Или как проще можно?


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 10:04
Ожидая помощи понемногу двигаюсь.
Чекбокс мой уже производит переключение действия:
void MainWindow::trig()
{
  cfg.preferences.onLoad = true;
}

Конечно же пока в одностороннем порядке :).

Хотелось бы что бы профи меня проконтролировали. В том ли направлении двигаюсь или все таки задачку можно решить проще - в одно действие?

P.S. Конечно же поверхностные знания дают о себе знать и простые вещи даются пока не легко. Не судите строго и отнеситесь с пониманием. Но для меня и эти простые вещи пока, что маленькие победы.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 11:51
Пока дошел до этого варианта:
В листинге preferences.cc следующая строка переключает чекбокс в окне настроек:
Код:
ui.onLoad->setChecked( p.onLoad );

Задача в mainwindow.cc создать меню для кнопки с переключением этого чекбокса.

Решение:
Создаем пункт меню:
Код:
itemMenu->addAction( &onLoad);

В заголовочном файле объявляем QAction * onLoad и trig


В mainwindow.cc связываем сигнал и слот:
Код:
  onLoad.setCheckable( true );
  onLoad.setChecked( cfg.preferences.onLoad );

  connect( &onLoad, SIGNAL( triggered() ),
           this, SLOT( trig() ) );

Прописываем функцию:
Код:
void MainWindow::trig()
{
  if ( onLoad.isChecked () )
  cfg.preferences.onLoad  = true;
  else
  cfg.preferences.onLoad = false;
}

Пока переключает в одностороннем порядке:
- Пункт меню в главном окне переключает режим и чекбокс в окне настроек.
- Чекбокс в окне настроек переключает режим, но не переключает чекбокс пункта меню в главном окне.
Осталось немного поправить.

Правильно ли все делаю или можно (нужно) по другому?


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 11:58
ты действительно думаешь, что по каким-то непонятным обрывкам кода, где даже не указаны типы переменных, тебе можно помочь?

тебе нужно начать с простого приложения (необязательно большого), которое ты напишешь с нуля, чтобы понять как и что работает. или можно воспользоваться одним из примеров в книгах по Qt. например у Бланшетт есть отличный пример про создание электронной таблицы.

если ui.preLoad — это QAction, то просто его и добавляй в меню, конечно при условии, что он всегда существует.

чтобы переключать чекбокс туда-сюда, тебе нужен сигнал triggered(bool) (и соответствующий слот). тогда в параметре будет находиться теукщее значение чекбокса. нечтение документации налицо.
Просто после вашей помощи все кажется намного проще, чем ожидаешь :)
когда тебе разжуют то, что можно и самому прочитать, то конечно становится легко

сейчас всё сделано правильно, но нерационально


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 12:31
kambala
Но все таки я ведь не стою на месте и двигаюсь. Не знаю медленно или в нормальном темпе. Но вроде как меня устраивает. В общем спустя рукава не жду ответа. Но ведь помощь может прийти быстрее, прежде чем я докопаюсь сам. Почему бы не спросить?
Согласен, что обрывочная информация. Но как получается.

если ui.preLoad — это QAction, то просто его и добавляй в меню, конечно при условии, что он всегда существует.
Интерфейс для окна преференсов создавался в Qt Designer  (preferences.ui) и там preLoad значится как QCheckBox.
В листинге preferences.cc записана токая строка:
Код:
ui.preLoad->setChecked( p.onLoad );

Кнопка с чекбоксом, дублирующая этот преференс нужна в главном окне mainwindow.cc.
И решить эту задачу в лоб, используя ui.preLoad как QAction, не получилось.

Собственно это для меня и есть исходные данные :). Попутно с Config:: немного ознакомился. Вот так и живем - методом проб и ошибок добрался пока туда, ну сами видите. Конечно же постепенно осознавая просматривая листинг, примеры и справочник.
Ну неужели вам все так легко давалось? Ну что ж я тугодум :). У меня так не получается.

А на счет простого приложения. Примеры я в общем то люблю, особенно если они грамотно описаны. Но вот реальная задача и мне ее надо решить и в общем то получается. Да собственно интереснее так совмещать полезное с обучением.

Ну ладно это опять лирика.
Хорошо задача решена не рационально. Если все таки поняли из того, что написал:
- Как можно попробовать решить по другому?
- Каким образом можно сделать обратную реакцию, что бы теперь при установке чекбокса в окне настроек, чекбокс кнопки тоже менялся? Неужели теперь придется листинг preferences.cc менять? Вот этого бы делать не хотелось.


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 12:59
Ну неужели вам все так легко давалось? Ну что ж я тугодум :). У меня так не получается.
нет, сначала тоже надо было посидеть и разобраться. читал и книжки и туториалы, пытался переносить свои консольные программы на окошки. когда-то не понял что такое сигналы и слоты и забросил изучение где-то на 2 года. потом взялся за это всерьез и разобрался. но на форум никогда не бежал «плакаться».
Хорошо задача решена не рационально. Если все таки поняли из того, что написал:
- Как можно попробовать решить по другому?
- Каким образом можно сделать обратную реакцию, что бы теперь при установке чекбокса в окне настроек, чекбокс кнопки тоже менялся? Неужели теперь придется листинг preferences.cc менять? Вот этого бы делать не хотелось.
я ведь тебе уже написал решение:
чтобы переключать чекбокс туда-сюда, тебе нужен сигнал triggered(bool) (и соответствующий слот). тогда в параметре будет находиться теукщее значение чекбокса. нечтение документации налицо.
тогда твой код будет выглядеть так:
Код
C++ (Qt)
connect( &onLoad, SIGNAL( triggered(bool) ), SLOT( trig(bool) ) );
...
void MainWindow::trig(bool isChecked)
{
   cfg.preferences.onLoad = isChecked;
}
надеюсь, что onLoad является членом класса, а не локальной переменной. вообще принято UI-переменные делать указателями. ну и имена методам желательно давать более информативные.

в идеале можно вообще добавить слот setOnLoad(bool) в класс Preferences, в котором будешь просто присваивать значение переменной, и тогда даже не придется метод в MainWindow создавать:
Код
C++ (Qt)
connect( &onLoad, SIGNAL( triggered(bool) ), &cfg.preferences, SLOT( setOnLoad(bool) ) );


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 13:35
надеюсь, что onLoad является членом класса, а не локальной переменной. вообще принято UI-переменные делать указателями. ну и имена методам желательно давать более информативные.
Если бы хорошо ориентировался в жаргоне :).

На сколько я понимаю onLoad у меня не является локальной переменной. Я ее объявил в mainwindow.hh, но несколько странным для меня способом. Там было так:
QAction escAct, focTrans, addTabAction, closeCurrentTab;
Здесь я и воткнул:
QAction escAct, focTrans, addTabAction, closeCurrentTab, onLoad;

По поводу кода, компилятор ругается так:
moc_mainwindow.cpp:-1: ошибка: undefined reference to `MainWindow::sideAltClicked(bool)'



Название: Re: Контекстное меню и QAction
Отправлено: Igors от Июнь 16, 2013, 14:16
Ну неужели вам все так легко давалось? Ну что ж я тугодум :). У меня так не получается.
Зародыш сначала похож на рыбу, потом на динозавра, и.т.д. то есть повторяет стадии эволюции. Это нормальный, естественный ход развития. Сначала "hello world" (как ходют, как сдают), потом консольные приложения, потом утилитки, дальше проект посерьезнее... Вы же пытаетесь "начать сверху", склеивать готовые куски, в результате постоянно попадаете в неудобное положение :) Надо признать что выходите из них достойно, как вежливый и культурный человек. Но суть от этого не меняется.

"Резвый старт" (получилась кнопка) совсем не означает "быстрый/удачный финиш". Отложите Qt на месяц-другой. Возьмите книжку по плюсам. Вот напр Саммерфидьд, порешайте примерчики оттуда (в конце каждой главы). После этого Qt не то что "пойдет", а "полетит". А пока Вы просто "мучаете кошку"  :)


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 14:19
QAction escAct, focTrans, addTabAction, closeCurrentTab;
обычно пишут QAction *escAct, *focTrans, *addTabAction, *closeCurrentTab
По поводу кода, компилятор ругается так:
moc_mainwindow.cpp:-1: ошибка: undefined reference to `MainWindow::sideAltClicked(bool)'
ты хоть понимаешь что тебе компилятор говорит? в .hh метод тоже надо переименовывать.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 14:21
Ну неужели вам все так легко давалось? Ну что ж я тугодум :). У меня так не получается.
Зародыш сначала похож на рыбу, потом на динозавра, и.т.д. то есть повторяет стадии эволюции. Это нормальный, естественный ход развития. Сначала "hello world" (как ходют, как сдают), потом консольные приложения, потом утилитки, дальше проект посерьезнее... Вы же пытаетесь "начать сверху", склеивать готовые куски, в результате постоянно попадаете в неудобное положение :) Надо признать что выходите из них достойно, как вежливый и культурный человек. Но суть от этого не меняется.

"Резвый старт" (получилась кнопка) совсем не означает "быстрый/удачный финиш". Отложите Qt на месяц-другой. Возьмите книжку по плюсам. Вот напр Саммерфидьд, порешайте примерчики оттуда (в конце каждой главы). После этого Qt не то что "пойдет", а "полетит". А пока Вы просто "мучаете кошку"  :)
Книжку я взял и читаю. Но результат мне нужен уже вчера. У меня не так уж и плохо получается. В общем то, что бы создать свое меню мне осталось освоить этот этап. Плохо ли хорошо, ошибки исправлю по мере их осознания.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 14:54
ты хоть понимаешь что тебе компилятор говорит? в .hh метод тоже надо переименовывать.
К сожалению не всегда. Вроде переименовал все, что надо, но где то допускаю не очевидную для себя ошибку.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 16:27
На сегодня уже отчаялся найти ошибку.
На этот вариант компилятор ругается.
Код:
  onLoad.setCheckable( true );
  onLoad.setChecked( cfg.preferences.onLoad);

    connect( &pronounceOnLoadMain, SIGNAL( triggered( bool ) ),
             this, SLOT( trig( bool ) ) );


Код:
  void trig( bool isChecked );

Код:
void MainWindow::trig( bool isChecked )
{
    cfg.preferences.onLoad = isChecked;
}

Какой метод я должен поменять не знаю.


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 16:44
компилятор тебе вообще говорит про метод sideAltClicked — он либо описан в .cc и не прописан в .hh либо наоборот


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 17:09
компилятор тебе вообще говорит про метод sideAltClicked — он либо описан в .cc и не прописан в .hh либо наоборот
Огромнейшее спасибо. Теперь душа спокойна :).
Видимо по невнимательности воткнул в заголовочный файл этот метод.
Отдохнуть, чай попить :). И было бы не плохо решить обратную задачку - чекбокс в окне настроек должен менять чекбокс меню кнопки. Это можно решить в mainwindow.cc не правя листинг preferences.cc? Или слишком мало информации для вас?


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 17:47
решается через сигнал-слотовое соединение (своих сигналов и слотов выдумывать не надо если есть доступ к чекбоксу в preferences), думаю справишься. если доступа нету, то править код preferences придется либо для получения доступа к компоненту либо для создания собственного сигнала и соединения сигнала чекбокса с этим сигналом.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 16, 2013, 17:58
решается через сигнал-слотовое соединение (своих сигналов и слотов выдумывать не надо если есть доступ к чекбоксу в preferences), думаю справишься. если доступа нету, то править код preferences придется либо для получения доступа к компоненту либо для создания собственного сигнала и соединения сигнала чекбокса с этим сигналом.
Спасибо за советы. Постараюсь решить самостоятельно. Но не обижайтесь если все таки возникнут затруднения и опять буду докучать вопросами :). Не хочу повторять ваши ошибки и раньше времени выбиться из сил отложив на два года обучение. Здесь мне гордость не поможет. Это процесс обучения. И ваша помощь гораздо эффективнее, чем книга, пусть она трижды хороша. Просто всему свое время. И книга будет эффективнее когда буду туда смотреть и получать информацию, а не фигу :).


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 16, 2013, 19:26
И ваша помощь гораздо эффективнее, чем книга, пусть она трижды хороша
ну понятное дело — тут ведь тебе дают точные ответы на конкретные вопросы, а после прочтения материала книжки надо делать по аналогии
И книга будет эффективнее когда буду туда смотреть и получать информацию, а не фигу :).
если читать книгу как художественную или рассчитывать на то, что прочитал и сразу всё понял (или «смотреть» в нее, а не читать, вдумываться и пробовать), то толку не будет


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 17, 2013, 10:44
Итак научился создавать контекстное меню для кнопки, для экшена, научился перебрасывать чекбоксы с преференсов в меню...
Понадобилось освоить еще один вид пункта меню.
Исходные данные:
- Правлю основной UI в mainwindow.cc.
- Имеется окно настроек pref.ui, pref.cc, pref.hh
- Необходимо создать пункт меню кнопки тулбара mainwindow для вызова окна настроек - pref.

Эта задача посложнее, как мне кажется. Может это мне кажется, во всяком случае сейчас понятия не имею с чего начать (другие хоть как то осознавал). Пока читаю информацию, поднимаю справочники задам вопрос. Может не и не так все сложно.
Естественно, сам пункт меню мне уже не составляет труда создать. Сложно создать слот.


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 17, 2013, 10:57
открыть окно — это самое элементарнейшее, что только может быть. даже hello world с этого начинается.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 17, 2013, 11:05
открыть окно — это самое элементарнейшее, что только может быть. даже hello world с этого начинается.
Ну я уже возможно заучился и бывает такое, что простые вещи кажутся сложными.
Это окно одна из вкладок преференсов и меня это сбило с толку. Но раз вы говорите, что это просто значит буду пробовать.


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 17, 2013, 11:07
не знаю как там реализовано, но обычно достаточно просто нужную вкладку выбрать


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 17, 2013, 11:15
Конечно же с другими окнами я экспериментировал и все получалось. Однако это если я знаю имя окон. Но я не совсем понимаю какое имя подставить и где в исходниках это искать и что дополнительно подцеплять и объявлять.
Постараюсь решить задачку. Раз обнадежили, что это не должно вызывать затруднения.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 19, 2013, 11:17
Можно ли сделать тулбар многострочным? Если, к примеру, все иконки не уместились в одну строку. Или простых вариантов нет?


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 19, 2013, 11:51
можно просто добавить второй тулбар под первым


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 19, 2013, 12:03
можно просто добавить второй тулбар под первым
Тут несколько специфичная задача. Иконки на тулбар добавляются по желанию пользователя и их много. Ну что то вроде закладок. И таких закладок может быть много.
Если тулбар невозможно регулировать по высоте, то хотя бы организовать автодобавление нового тулбара по достижению предела. Причем при растягивании/сужении окна это должно  работать автоматом.
Понимаю, что информации мало. Но может  с подобной задачей приходилось сталкиваться.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 06:36
Кстати, по поводу чтения книг.
Опять взял в руки Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008. Как и ожидал, сейчас читаю ее достаточно осознанно и такое чтение уже нравится. Не приходится особо задумываться на терминологией и смотреть в листинг примеров как баран на новые ворота. Так, что в очередной раз метод "От динозавра к зародышу" работает стабильно и эффективнее. Месяц назад я плохо разбирался в жаргоне, теперь более менее ориентируюсь. Это как учить лингвоязык - можно уметь правильно читать, но не понимать смысл слов и тем более предложений. Но тут, возможно, многое индивидуально.


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 08:19
Сделайте свой виджет.

PS конечно осознание и поглощение информации индивидуально.

PPS какая то тягомотная тема :D


Название: Re: Контекстное меню и QAction
Отправлено: Igors от Июнь 20, 2013, 12:09
Так, что в очередной раз метод "От динозавра к зародышу" работает стабильно и эффективнее.
Да, но при таком направлении эволюции конечным результатом будет зародыш  :)


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 14:31
Да, но при таком направлении эволюции конечным результатом будет зародыш  :)
Это если путать процесс эволюции с процессом познания. Довольно таки скучно начинать с винтиков. Интереснее разобрать механизм и посмотреть как он устроен. Конечно сейчас я передвигаю блоки и доволно не плохо получается. Затем постепенно по мере необходимости блоки на кирпичики поделим. В общем то и сейчас это уже делаю. Конечно же свой виджет я пока не напишу (или напишу :)). Но пока хватает того материала который есть.


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 14:43
Самое распространённое заблуждение. Особенно хорошо оно "чувствуется" в электронике.
Когда маааленькая ошибочка приводит к полному выгоранию платки :D

ЯП просто сглаживает неприятные моменты.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 16:18
Ладно. Каждый учится как ему хочется.

По делу.
В mainwindov.cc записал такую строчку:
Код:
ui.paneWidget->Label.setText( text );
Здесь пришлось вставить, поскольку моя функция меняет конфигурационный файл и синхронно эта метка должна поменяться.

Сама же метка Label описана в файле panewidget.cc

Компилятор ругнулся, что мол в приватной зоне метка.
Я просто в файле panewidget.hh   QLabel Label; прописал в public:.

Ничего страшного не произошло и вроде как работает. Но вот приложение как то тормозит при закрытии. Иконка довольно долго не пропадает с трэя.

Что я делаю не так? И как правильнее? Понимаю, что информации мало. Но может для специалистов мои ошибки очевидны? Тормозить начинает именно когда QLabel Label; прописываю в public:. Если не прописать, то закрывается приложение быстро. Но Label виджета меняется только при перезапуске приложения (собственно оно и понятно).


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 16:44
С учетом размера вашей темы, там может быть крокодил, кушающий кролика :D

Моё мнение - хочешь помощи, код в студию. Не хочешь - играешь в телепатов.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 16:54
Код нет особого смысла давать. Это слишком много и в разных листинга (вряд ли будет желание разбираться досконально). Программа вовсе не для новичков.

Но хотя бы знать если я просто так грубо перевел QLabel Label; из private: в public: в этом нет ничего такого слишком грубого :)? Может есть другой способ опубликовать эту метку в mainwindow.cc?


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 17:10
Нет смысла давать советы. Это слишком много и в разных листинга (вряд ли будет желание разбираться досконально). Совет вовсе не для новичков.

PS никак не должен тормозить QLabel.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 17:21
PS никак не должен тормозить QLabel.
На этом тоже спасибо. Окно приложения закрывается без тормозов. А вот иконка в трэе висит ощутимо дольше. Даже если ничего не правлю в mainwindow.cc. Но если эту метку опубликовать, то вот такая ерунда. По другому к ней нельзя никак доступиться (если с привата не убирать)?
Что ж будем самостоятельно разбираться или оставим пока как есть :). Страшного в общем то ничего нет.


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 17:25
Я тут почитал вашу тему :D

По-моему было бы проще полностью переписать вашу программу, избавившись от "много листинговости" и провести ревизию необходимого функционала.

Но это - совет.

PS "вопрос + код" = быстрый и четкий ответ. "вопрос" = телепатияяяя :D


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 20, 2013, 17:25
тут уже и догадаться можно было:
Код
C++ (Qt)
public:
   QLabel &getLabel() const { return Label; }
private:
   QLabel Label;

перевод переменной из одной области видимости в другую никак не может повлиять на производительность.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 19:46
перевод переменной из одной области видимости в другую никак не может повлиять на производительность.
Тем не менее иконка начинает тормозить в трее.
В panewidget.hh опубликован слот:
Код:
public slots:
  void updateLabel();
Как понял он меняет состояние метки на виджете. На сколько понимаю можно его использовать. Как это сделать правильно?


Название: Re: Контекстное меню и QAction
Отправлено: kambala от Июнь 20, 2013, 20:04
перевод переменной из одной области видимости в другую никак не может повлиять на производительность.
Тем не менее иконка начинает тормозить в трее.
ну так воспользуйся кодом, который я тебе написал в предыдущем сообщении.
В panewidget.hh опубликован слот:
Код:
public slots:
  void updateLabel();
Как понял он меняет состояние метки на виджете. На сколько понимаю можно его использовать. Как это сделать правильно?
найди себе друзей-телепатов. а лучше пойди поучи язык. уже реально надоело.


Название: Re: Контекстное меню и QAction
Отправлено: Bepec от Июнь 20, 2013, 20:05
+1.

PS заношу ник в свой чОрный список и без полного проекта, приложенного к вопросу отвечать отказываюсь ;) Ариведерчи.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 20:10
Ok! Извините. Устал я.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 20, 2013, 21:19
ну так воспользуйся кодом, который я тебе написал в предыдущем сообщении.
Помогло.
Для меня многие вещи не очевидны. Поэтому сразу не получалось. А там уже метод проб и ошибок.
Так не  идет:
Код:
    QLabel &getLabel() const { return Label; }
Так идет:
Код:
    QLabel &getLabel() { return Label; }
Еще раз спасибо за терпение.


Название: Re: Контекстное меню и QAction
Отправлено: Spark от Июнь 24, 2013, 13:27
ui.line - QLineEdit. В зависимости от состояния чекбокса этот виджет должен быть показан либо на тулбаре, либо на своем виджете в котором изначально расположен с помощь Qt Дизайнера.
Чекбокс сделан, сигнал идет, слот срабатывает.
Вот этот слот:
Код
C++ (Qt)
void MainWindow::lineInDockTriggered( bool isChecked )
{
   cfg.preferences.lineInDock = isChecked;
   if (cfg.preferences.lineInDock )
   {
     navToolbar->addWidget( ui.line );
   }
   else
   {
       ui.line->setVisible( false );
   }
}

Но с родного места на тулбар идет при установке чекбокса. Обратно уже не хочет (при перезапуске естественно становится там где предписал чекбокс). Конечно же понимаю, что не правильно второе действие. В общем как переинициализировать окно без перезапуска программы?
Надеюсь ясно пояснил. Опять же не судите строго. Книгу читаю, справочник смотрю, но это не единственная задача решенная на сегодня. Довольно изматывает. Честно говоря я только день сегодня потратил на то как вообще правильно связать сигнал с этим слотом, а ошибка оказалась элементарной (слал не тот сигнал), но для меня не очевидной (спросил бы наверное за пол часа и получил бы ответ).