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

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

Страниц: 1 [2] 3 4 ... 7   Вниз
  Печать  
Автор Тема: Контекстное меню и QAction  (Прочитано 37335 раз)
Spark
Гость
« Ответ #15 : Июнь 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 );
Записями.
Но с первой кнопка дублируется, со второй нет.
Во второй записи вы не прописали тулбар. Думал, что здесь и кроется причина, но без этого выдает ошибку. Однако, такая запись сработала как надо, даже если прописать тулбар.

Пока не все проблемы решены, но может быть ближе к желаемому результату Улыбающийся.
Записан
Spark
Гость
« Ответ #16 : Июнь 14, 2013, 09:23 »

К сожалению чем дальше уходим от первоначального варианта тем больше проблем пока.
Для трея прописано:
Код:
trayIconMenu.addAction( enBat );
Может можно действовать через слот setDefaultAction кнопки scButton?
Извините, если выражаюсь не правильно. Но надеюсь, что меня поймут.
Записан
VPS
Гость
« Ответ #17 : Июнь 14, 2013, 10:14 »

 Spark, Вам всё-таки не мешало бы заглянуть в документацию по Qt (хотя бы по тем классам, с которыми Вы "возитесь"), благо она хорошо написана. И тогда, скорее всего, большинство вопросов отпадут сами собой... Подмигивающий
Записан
Spark
Гость
« Ответ #18 : Июнь 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! Ушел читать доки Улыбающийся.
А за информацию все равно спасибо. В общем то помогла и сдвинула с мертвой точки. Раньше не удавалось вообще запустить контекстное меню на этом экшене. Для других более простых примеров эти варианты подойдут (в программе есть и попроще кнопки, которые то же надо снабдить контекстом или действием по правой кнопке мыши).
« Последнее редактирование: Июнь 14, 2013, 11:14 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #19 : Июнь 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 (основную форму).
« Последнее редактирование: Июнь 14, 2013, 11:48 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #20 : Июнь 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);
То если посчастливится запустится. И на тулбаре одна нужная иконка. К сожалению проблем больше.

Надеюсь ясно пояснил проблему.
Записан
VPS
Гость
« Ответ #21 : Июнь 14, 2013, 12:22 »

когда не можешь внятно объяснить — рисуй. я, например, до сих пор не могу понять что у тебя за проблема с лишними кнопками.
Если я правильно понял, то Spark-у надо добавить дополнительную функциональность в виде контекстного меню для конкретной кнопки на toolbar-е, поэтому тут и появляется объект типа QToolbarButton...

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

« Последнее редактирование: Июнь 14, 2013, 12:24 от vps » Записан
Spark
Гость
« Ответ #22 : Июнь 14, 2013, 12:30 »

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

Ну тогда смотрите, где у Вас ещё раз идёт создание или добавление этого действия, тут без исходников, видимо, не разобраться (по крайне мере, мне)...
Записан
Spark
Гость
« Ответ #24 : Июнь 14, 2013, 12:35 »

В принципе есть рабочий вариант. И может быть более рационален. Когда просто создаю кнопку и переписываю все на нее. Она одна, включает то, что мне надо и работает с контекстным меню Улыбающийся. Надо только завяать на нее кнопку в трее. Наверное это проще.

Но хотелось бы понять, что же я не правильно делаю.
« Последнее редактирование: Июнь 14, 2013, 12:42 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #25 : Июнь 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);
вот так разве не получится то, что ты хочешь?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #26 : Июнь 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 );
На вид все работает, кнопка одна, в трее кнопка то же реагирует, контекст работает и вроде программа запускается без проблем. Сейчас постепенно добавлю недостающие строчки и если не будет вылетать то здорово.
Кстати, я пытался эту строку вписать. Но вот как раз тот вариант, когда смотришь в справочник и видишь фигу. Что то не допонимаю и не правильно пишу строку (компилятор ругался) и в результате отказался от правильного решения еще вчера. Советы наставника все таки бесценны. Огромное спасибо. Надеюсь сегодня уже справиться с одной кнопкой и оформить как надо. Затем перелопачу все кнопки.
« Последнее редактирование: Июнь 14, 2013, 13:13 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #27 : Июнь 14, 2013, 13:32 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #28 : Июнь 14, 2013, 15:50 »

Проверил. Вроде все работает теперь отлично.
Спасибо! Я снова счастлив и могу двигаться дальше Улыбающийся.
Можете считать меня совсем ленивым, но маленький штришок.
В оригинале иконка QAction enBat становилась невидимой, если в настройках программы отключить Экшин.
Делается это так:
Код:
enBat->setVisible( cfg.pref.set );
Кнопка же scButton ведет себя несколько иначе: мутнеет перестает функционировать.
Код:
scButton->setVisible( cfg.pref.set );
не особо помогает. Только при перезапуске исчезает/появляется.
Как связать Экшен с кнопкой в этом случае?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #29 : Июнь 14, 2013, 16:57 »

вешать на кнопку другой (аналогичный) экшн, иначе не получится

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2] 3 4 ... 7   Вверх
  Печать  
 
Перейти в:  


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