Название: Сигналы из меню? Отправлено: Javaca от Апрель 09, 2012, 23:55 Доброго времени суток!
Прошу у Вас помощи. Никак не могу разобраться, как работают сигналы вызовов из меню. Никак не могу сделать QObject::connect Вот мой пример: Код: #include <QApplication> Помогите пожалуйста, кто может ! Заранее благодарю за ответы! Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 00:08 Доброго времени суток! Ясное дело, у тебя ведь show_info() функция а не слот. Слоты можно делать только классам наследованным от QObject.Прошу у Вас помощи. Никак не могу разобраться, как работают сигналы вызовов из меню. Никак не могу сделать QObject::connect Вот мой пример: Код: #include <QApplication> Помогите пожалуйста, кто может ! Заранее благодарю за ответы! Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 00:10 Хорошо, а эту функцию из меню вызвать можно?
Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 00:34 Хорошо, а эту функцию из меню вызвать можно? Вот так конектишь:Код Вот класс: myfunctions.h: Код myfunctions.cpp: Код
Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 01:14 Что, в Qt нельзя вызвать функцию из меню без всяких заморочек? И это единственный метод, воротить не пойми что? В gtk делается легко и просто:
Код: static void show_info(GtkWidget *widget, gpointer window) Вызывается: Код: g_signal_connect (G_OBJECT (mesaga), "activate", G_CALLBACK (show_info), (gpointer) window); Как в Qt по человечески из меню вызвать нужную функцию? Название: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 07:59 Что, в Qt нельзя вызвать функцию из меню без всяких заморочек? И это единственный метод, воротить не пойми что? В gtk делается легко и просто: Мне одному показалось, что вот это:... Код: QObject::connect(mesaga, SIGNAL(triggered()), &func, SLOT(showInfo())); Как в Qt по человечески из меню вызвать нужную функцию? Слот - это функция, которая также, как и любая другая функция C++ подчиняется соответствующим правилам языка. Просто к слоту, в дополнение, можно подключать сигналы.Название: Re: Сигналы из меню? Отправлено: Alex_C от Апрель 10, 2012, 09:39 Что, в Qt нельзя вызвать функцию из меню без всяких заморочек? Слот - это и есть самая обычная ф-ция. В чем заморочка? В определении ф-ции написать ключевое слово slots? Мне одному показалось, что вот это: Нет :) Мне вообще кажется, что на Qt все максимально просто и понятно, в отличии того же gtk. Название: Re: Сигналы из меню? Отправлено: Alex Custov от Апрель 10, 2012, 09:48 Код: static void show_info(GtkWidget *widget, gpointer window) Что, в GTK нельзя показать messagebox безо всяких заморочек? В Qt делается легко и просто: Код
P.S. Вечный спор. Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 09:52 Отнюдь не вечный ;)
Достаточно просто сравнить время освоения Qt и GTK. Сотни параметров, зачастую ненужных. Универсальность - да, многофункциональность - да, удобство - нееее. Название: Re: Сигналы из меню? Отправлено: GreatSnake от Апрель 10, 2012, 10:14 Как в Qt по человечески из меню вызвать нужную функцию? А по-человечески в Qt всё делается очень просто:заводится производный от QMainWindow класс, в который помещается ваш show_info() слот и не сваливается всё в кучу в main(). Название: Re: Сигналы из меню? Отправлено: Авварон от Апрель 10, 2012, 11:38 Человек не понимает ООП подхода.
Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто. Название: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 11:54 Человек не понимает ООП подхода. "лямбдам"? Можно подробнее? Что это?Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто. Название: Re: Сигналы из меню? Отправлено: Igors от Апрель 10, 2012, 12:00 Ну почему сразу "не понимает". Просто "учиться легко - трудно переучиваться". Этот эффект возникает всегда при переходе на новый инструментарий. Действительно почему здесь можно только через слот/сигнал? Это может быть неудобно! При этом как-то забывается что иметь массу статиков которых "ни пришей - ни пристегни", мягко говоря, не очень красиво и никак не удобнее. Но там как бы уже привык не обращать внимания на запах - а здесь еще нет :)
Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 10, 2012, 12:17 Человек не понимает ООП подхода. А В PyQt/PySide это сразу было :P. Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто. Поэтому холивар разводить по поводу, что круче и удобнее gtk или qt бессмысленно, потому что Python круче! ;D Цитировать ноги, крылья... - главное хвост! Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 10, 2012, 12:20 "лямбдам"? Можно подробнее? Что это? http://ru.wikipedia.org/wiki/Анонимная_функцияНазвание: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 12:33 http://ru.wikipedia.org/wiki/Анонимная_функция Едрить, понял :) просто не знал, что анонимные так называютНазвание: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 13:19 Мне одному показалось, что вот это: Код: QObject::connect(mesaga, SIGNAL(triggered()), &func, SLOT(showInfo())); И чем короче приведенный вами код от этого? Кол-вом символов ;D Код: g_signal_connect (G_OBJECT (mesaga), "activate", G_CALLBACK (show_info), (gpointer) window); P.S. Вечный спор. Никакого спора нет. Насколько я понимаю в Qt невозможно напрямую вызвать функцию из меню в Сишном стиле, тогда как в GTK существует как минимум два способа вызовов, используя например g_signal_connect или gtk_signal_connect? на мой взгляд на данный момент, кроме реализации MDI в Qt, никаких преимуществ у Qt нет, например перед GTK. Вопрос остается открытым !!! Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 10, 2012, 13:34 Насколько я понимаю в Qt невозможно напрямую вызвать функцию из меню в Сишном стиле, тогда как в GTK существует как минимум два способа вызовов, используя например g_signal_connect или gtk_signal_connect? Печалька ::)на мой взгляд на данный момент, кроме реализации MDI в Qt, никаких преимуществ у Qt нет, например перед GTK. Вопрос остается открытым !!! Qt - это объектно-ориентированная библиотека, в ней принято работать на уровне классов и взаимодействия объектов. Все callback'и (назовём их так) реализуются через механизм сигнал-слот. Что вам не понятно? Вы книжки про ООП и Qt вообще читали? Зачем нужно пытаться писать в "сишном" стиле при использовании Qt, я этого не понимаю. Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 13:35 Вопрос остается открытым !!! Что за вопрос? Как вызвать обычную функцию при нажатии?Как говорится: "Не лезь в чужой монастырь со своими правилами". В аттаче я изменил твой код так, как это принято делать в Qt. Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 13:42 Хе хе хе. Невозможно прямо вызвать функцию в стиле С. Да вызывай, кто тебе мешает?
Всего то <твой класс>-><слот выполнения функции>. Нежелаешь разбираться и чужой устав в другой язык суёшь. PS количество символов, это что - ничто. А вот что такое читабельность и отсутствие громоздкости конструкций - скажи ка мне ;) Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 13:56 В аттаче я изменил твой код так, как это принято делать в Qt. Зад принято подтирать туалетной бумагой, а кто сказал, что его нельзя подтереть чем нибудь-другим, например газетой или тетрадным листом? ;D Благодарю за код, но вопрос был совсем другой. Меня интересует вызов функции напрямую без вынесения ее в класс. К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. Название: Re: Сигналы из меню? Отправлено: mutineer от Апрель 10, 2012, 13:57 В аттаче я изменил твой код так, как это принято делать в Qt. Зад принято подтирать туалетной бумагой, а кто сказал, что его нельзя подтереть чем нибудь-другим, например газетой или тетрадным листом? ;D Благодарю за код, но вопрос был совсем другой. Меня интересует вызов функции напрямую без вынесения ее в класс. К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. Если ты гоняешься за килобайтами в бинарнике, то в сторону Qt тебе лучше не смотреть... Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 13:59 И вообще переходить на ассемблер ;)
По секрету скажу - писать программу в машинных кодах, самое то. Ещё и upx'сом запаковать. Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 14:03 В аттаче я изменил твой код так, как это принято делать в Qt. Зад принято подтирать туалетной бумагой, а кто сказал, что его нельзя подтереть чем нибудь-другим, например газетой или тетрадным листом? ;D Благодарю за код, но вопрос был совсем другой. Меня интересует вызов функции напрямую без вынесения ее в класс. К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. Название: Re: Сигналы из меню? Отправлено: Igors от Апрель 10, 2012, 14:10 Благодарю за код, но вопрос был совсем другой. Меня интересует вызов функции напрямую без вынесения ее в класс. К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. Ну так зачем Вам тогда "такой плохой" Qt? :) Продолжайте пользовать GTK или др. тул - и все дела. Напр я всегда тихо ненавидел командную строку, но что поделать если иногда "так надо", мало ли чего мне нравится или нет. Зад принято подтирать туалетной бумагой, а кто сказал, что его нельзя подтереть чем нибудь-другим, например газетой или тетрадным листом? ;D Классики подробно обсуждали этот вопросЦитировать кто подтирает зад бумагой - тот весь обрызган желтой влагой (примерно как с вызовом static ф-ции :))Название: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 14:13 Зад принято подтирать туалетной бумагой, а кто сказал, что его нельзя подтереть чем нибудь-другим, например газетой или тетрадным листом? ;D Могу с уверенностью заявить (и многие со мной согласятся), что "чем-нибудь другим" навряд ли доставит удовольствиеБлагодарю за код, но вопрос был совсем другой. Меня интересует вызов функции напрямую без вынесения ее в класс. В ООП это не нужно. А смешение стилей к добру не приведёт скорее всего.К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. 25 Кб изящного кода. Чем не повод возрадоваться?Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 14:18 К сожалению ваш код после компиляции весит 25 Кб, что два раза больше скомпилированного моего кода вес которого составляет 12 Кб. Fix:Цитировать К сожалению ваш рабочий код после компиляции весит 25 Кб, что два раза больше скомпилированного моего нерабочего кода вес которого составляет 12 Кб. Кстати UPX сжимает до 10.5 Кб.Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 10, 2012, 14:24 Могу с уверенностью заявить (и многие со мной согласятся), что "чем-нибудь другим" навряд ли доставит удовольствие На востоке давно придумали более изящное решение - подмывание. ;DJavaca, чего вы хотите доказать? Что Qt - говно, потому что не умеет вызывать функции, определённые вне классов? При этом ваш аргумент только один: 12кб против 25кб. Ну это просто смешно. Словно всё сравнивается только размерами. :) Название: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 14:27 На востоке давно придумали более изящное решение - подмывание. ;D Восток - дело тонкое )) сорри за оффтопНазвание: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 14:35 Видите сколько Вы способов назвали о том как подтереть зад ;D Но ни назвали ни одного способа, как реализовать вызов функции из меню без внесения ее в класс. Одно сплошное словоблудие :P
Могу с уверенностью заявить (и многие со мной согласятся), что "чем-нибудь другим" навряд ли доставит удовольствие Зад подтирают не ради удовольствия, а ради чистоты ;D В ООП это не нужно. А смешение стилей к добру не приведёт скорее всего. К добру не приводит пьянство, табакокурение и наркомания, а вызов обычной функции из меню уж никак к этому не относится. 25 Кб изящного кода. Чем не повод возрадоваться? 12 Кб изящного кода. Чем не повод возрадоваться? ;) Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 14:38 12 Кб изящного кода. Чем не повод возрадоваться? ;) Fix:Цитировать 12 Кб изящного НЕРАБОЧЕГО кода. Чем не повод возрадоваться? ;) Как я уже говорил UPX сжимает 25 Кб рабочего кода в 10.5 Кб, чем не повод порадоваться?А можно вообще юзать asm и WinApi, Тогда вообще будет в пределах 1-2 Кб, чем не повод повально перейти на asm и WinApi? Название: Re: Сигналы из меню? Отправлено: alexis031182 от Апрель 10, 2012, 14:46 Видите сколько Вы способов назвали о том как подтереть зад ;D С нашей стороны прозвучал лишь один способ, да и то... э-э-э... не наш ))Но ни назвали ни одного способа, как реализовать вызов функции из меню без внесения ее в класс. Одно сплошное словоблудие :P А чего Вы хотели от вопроса из серии "А ты купи слона"?Зад подтирают не ради удовольствия, а ради чистоты ;D Ну если ради чистоты, то конечно можно и наждачкой. Кто же спорит )К добру не приводит пьянство, табакокурение и наркомания, а вызов обычной функции из меню уж никак к этому не относится. Ещё семь смертных грехов для сравнения, и мы познаем добро и зло12 Кб изящного кода. Чем не повод возрадоваться? ;) Тоже не плохо, я рад :)Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 14:54 Как я уже говорил UPX сжимает 25 Кб рабочего кода в 10.5 Кб, чем не повод порадоваться? Сожмите UPX 12 Кб кода, сколько получится? А можно вообще юзать asm и WinApi, Тогда вообще будет в пределах 1-2 Кб, чем не повод повально перейти на asm и WinApi? На винде можно и нужно юзать Assembler и WinAPI. Но есть куда более простой способ иметь результаты эдентичные asm в Windows - это WinAPI + dcc32.exe (компилятор delphi 3 и урезанные System.pas и SysInit.pas) + link.exe, результаты которых будет пустое окно равное 900 байтам. Кто-то использует ASM, а кто-то и по другому достигает аналогичных результатов. И правила тут не важны, важен результат !!! Я Windows не использую, сижу на Linux Mint. Если бы сидел на винде, меня бы тут не было бы. Название: Re: Сигналы из меню? Отправлено: Авварон от Апрель 10, 2012, 14:54 По-моему он тупо не может понять что способа дернуть сишную функцию нет:)
Для топик стартера - это полне логично, что в гтк, который написан на _сях_ дергаются _сишные_ функции, а на кутях, которые написаны на с++ дергаются _плюсовые_ (мембер) функции. Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 10, 2012, 15:06 По-моему он тупо не может понять что способа дернуть сишную функцию нет Я это понял давно, просто хотел, чтобы Вы это озвучили !!! :) Название: Re: Сигналы из меню? Отправлено: RealDuke от Апрель 10, 2012, 15:09 Уел весь форум! Красава! Со спокойной совестью можешь поставить себе очередную галочку в графе "победы GTK над Qt" :))
Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 15:12 Ыхыхыхы :) побольше бы таких ;)
Глядишь и операционки появятся аля " *nix весом в 7 кб ". Чесслово, хотел бы вернуть время " 1000 игр на одном диске! ". PS стремитесь к совершенству. Меньше гуи, меньше вывода, меньше логики и удобства - вуаля ==================>>> программа весом 1 кб :) Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 10, 2012, 15:14 По-моему он тупо не может понять что способа дернуть сишную функцию нет:) По-моему чел просто троллит. Заняться нечем, надоело писать на ассемблере, вот и зашёл расслабиться, да поржать. :)Название: Re: Сигналы из меню? Отправлено: _OLEGator_ от Апрель 10, 2012, 15:34 Еще один тролль на форуме - вам не надоело его кормить?
Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 15:41 Наоборот ) Я после той "Девушки" ещё так здорово не веселился :)
Название: Re: Сигналы из меню? Отправлено: sudo от Апрель 10, 2012, 15:47 Хм... Если код на gtk красив, то я ничего не понимаю в красоте :'(
Название: Re: Сигналы из меню? Отправлено: Авварон от Апрель 10, 2012, 16:49 Javaca
Кутешникам нужен был способ соединять методы _классов_ и они написали сигнал-слоты. Потом пришли гткашники и сделали свой коннект с блекджеком и шлюхами. Но есть нюанс. Сишную функцию зарегать в качестве коллбека ничего не стоит (просто передали указатель на ф-ию нужной сигнатуры а-ля void (*onChecked)(bool checked); и радуемся). В то же время для _классов_ (2й раз выделяю) этот подход не прокатывает, тк помимо указателя на ф-ию нужен указатель на объект класса. И в чистых плюсах это сделать _невозможно_ (без шаблонной магии). Так что гткашный коннект - это лишь копия _синтаксиса_ кутешных коннектов, тк этот синтаксис оказался удобным. Не стоит забывать для чего придуманы сигналы и слоты, а также о том, что в сишке они _вообще_ не нужны - без них и так пишется. И обвинять _родной_ кутешный коннект в том, что он работает не так, как гткашная калька с него - это странно. Вкратце - кутешные коннекты фиксят косяк плюсов, гткашные - просто удобная обертка над коллбеком. Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 10, 2012, 18:57 Но есть куда более простой способ иметь результаты эдентичные asm в Windows - это WinAPI + dcc32.exe (компилятор delphi 3 и урезанные System.pas и SysInit.pas) + link.exe, результаты которых будет пустое окно равное 900 байтам. Кто-то использует ASM, а кто-то и по другому достигает аналогичных результатов. И правила тут не важны, важен результат !!! Чтоб тебе такой код всю жизнь поддерживать =).Название: Re: Сигналы из меню? Отправлено: Bepec от Апрель 10, 2012, 20:58 АААА... ужасно проклятье!!!
Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 12, 2012, 18:46 А как мне в функцию передать pole ?
QMdiArea *pole = new QMdiArea; -> открыто в MainWindow ! Код: void MainWindow::nahog() Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 12, 2012, 18:58 А как мне в функцию передать pole ? Сделай pole членом класса MainWindow, и передавать не надо =).QMdiArea *pole = new QMdiArea; -> открыто в MainWindow ! Код: void MainWindow::nahog() Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 12, 2012, 19:40 Сделай pole членом класса MainWindow, и передавать не надо =). Тоесть? Название: Re: Сигналы из меню? Отправлено: V1KT0P от Апрель 12, 2012, 19:51 Сделай pole членом класса MainWindow, и передавать не надо =). Тоесть? Код
Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 12, 2012, 20:25 Название: Re: Сигналы из меню? Отправлено: iroln от Апрель 13, 2012, 08:27 Javaca, твоё счастье уже близко. :)
http://habrahabr.ru/post/141983/ Название: Re: Сигналы из меню? Отправлено: Javaca от Апрель 13, 2012, 13:23 Javaca, твоё счастье уже близко. :) http://habrahabr.ru/post/141983/ Отличная новость. Будем ждать выход оф.версии ;D Код: static void someFunction() ------------------------------- Еще у меня возник вопрос. Скажите покажалуйста, как мне убрать у окна кнопку "Maximize" и выпадающее меню у значка Qt (Restore, Move, Size и т.д.)? Окно естественно MDIChild. я разобрался уже, может кому сгодиться (пока без кнопки Close): Код: sp_sostoy->setWindowFlags(Qt::SubWindow | Qt::WindowMinimizeButtonHint | Qt::WindowTitleHint); Название: Re: Сигналы из меню? Отправлено: m_ax от Апрель 13, 2012, 14:02 Если уж прям такая необходимость соединять сигналы с не мембер функциями, можете воспользоваться сторонними либами, например boost::signals, libsigc++ (которая, кстати используется в gtkmm) или libssc
В последнем случае это будет выглядеть так: Код
И будет вам счастье) |