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

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

Страниц: 1 2 3 [4] 5 6 7   Вниз
  Печать  
Автор Тема: Контекстное меню и QAction  (Прочитано 38391 раз)
VPS
Гость
« Ответ #45 : Июнь 14, 2013, 21:06 »

Я много чего попутно делаю. И документацию читаю. Но ведь надо ткнуть пальцем хотя бы, что читать. Ну не так просто новичку понять многие моменты. Интересны были бы преподаватели в школе или в вузах, которые постоянно твердили бы - ищи в гоогл или читай документацию, там все есть Улыбающийся. А зачем тогда вообще нужны наставники? Вроде как говорили уже об этом. Не так уж плохо продвинулся за четвертую неделю Улыбающийся. Может другие и быстрее, но я пока такими небольшими темпами с нуля Улыбающийся.
Спасибо за терпение и за то, что все таки отвечаете и учите нас уму разуму Улыбающийся.

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

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

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #46 : Июнь 15, 2013, 15:22 »

Интересно, а "меняю" когда-нибудь исправят на "меню" в заголовке темы?
Записан

Юра.
Spark
Гость
« Ответ #47 : Июнь 16, 2013, 05:48 »

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

Есть UI для mainwindow

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

Как проще для кнопки тулбара (пункт меню кнопки) в mainwindow добавить этот чекбокс?
Надеюсь достаточно ясно пояснил ситуацию.
Не пинайте к справочникам. Ищу и не только там. Просто после вашей помощи все кажется намного проще, чем ожидаешь Улыбающийся. Пока ищу самостоятельно, может помощь и здесь придет.
Записан
Spark
Гость
« Ответ #48 : Июнь 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()
{

}

И вообще правильным ли путем пошел? Или как проще можно?
« Последнее редактирование: Июнь 16, 2013, 08:46 от Spark » Записан
Spark
Гость
« Ответ #49 : Июнь 16, 2013, 10:04 »

Ожидая помощи понемногу двигаюсь.
Чекбокс мой уже производит переключение действия:
void MainWindow::trig()
{
  cfg.preferences.onLoad = true;
}

Конечно же пока в одностороннем порядке Улыбающийся.

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

P.S. Конечно же поверхностные знания дают о себе знать и простые вещи даются пока не легко. Не судите строго и отнеситесь с пониманием. Но для меня и эти простые вещи пока, что маленькие победы.
« Последнее редактирование: Июнь 16, 2013, 10:10 от Spark » Записан
Spark
Гость
« Ответ #50 : Июнь 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;
}

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

Правильно ли все делаю или можно (нужно) по другому?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

ты действительно думаешь, что по каким-то непонятным обрывкам кода, где даже не указаны типы переменных, тебе можно помочь?

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

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

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

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

Изучением 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
Гость
« Ответ #52 : Июнь 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 менять? Вот этого бы делать не хотелось.
« Последнее редактирование: Июнь 16, 2013, 12:42 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #53 : Июнь 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) ) );
« Последнее редактирование: Июнь 16, 2013, 13:01 от 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
Гость
« Ответ #54 : Июнь 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)'

« Последнее редактирование: Июнь 16, 2013, 14:10 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ну неужели вам все так легко давалось? Ну что ж я тугодум Улыбающийся. У меня так не получается.
Зародыш сначала похож на рыбу, потом на динозавра, и.т.д. то есть повторяет стадии эволюции. Это нормальный, естественный ход развития. Сначала "hello world" (как ходют, как сдают), потом консольные приложения, потом утилитки, дальше проект посерьезнее... Вы же пытаетесь "начать сверху", склеивать готовые куски, в результате постоянно попадаете в неудобное положение Улыбающийся Надо признать что выходите из них достойно, как вежливый и культурный человек. Но суть от этого не меняется.

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #56 : Июнь 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 метод тоже надо переименовывать.
Записан

Изучением 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
Гость
« Ответ #57 : Июнь 16, 2013, 14:21 »

Ну неужели вам все так легко давалось? Ну что ж я тугодум Улыбающийся. У меня так не получается.
Зародыш сначала похож на рыбу, потом на динозавра, и.т.д. то есть повторяет стадии эволюции. Это нормальный, естественный ход развития. Сначала "hello world" (как ходют, как сдают), потом консольные приложения, потом утилитки, дальше проект посерьезнее... Вы же пытаетесь "начать сверху", склеивать готовые куски, в результате постоянно попадаете в неудобное положение Улыбающийся Надо признать что выходите из них достойно, как вежливый и культурный человек. Но суть от этого не меняется.

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

ты хоть понимаешь что тебе компилятор говорит? в .hh метод тоже надо переименовывать.
К сожалению не всегда. Вроде переименовал все, что надо, но где то допускаю не очевидную для себя ошибку.
Записан
Spark
Гость
« Ответ #59 : Июнь 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;
}

Какой метод я должен поменять не знаю.
« Последнее редактирование: Июнь 16, 2013, 16:29 от Spark » Записан
Страниц: 1 2 3 [4] 5 6 7   Вверх
  Печать  
 
Перейти в:  


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