Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Javaca от Апрель 09, 2012, 23:55



Название: Сигналы из меню?
Отправлено: Javaca от Апрель 09, 2012, 23:55
Доброго времени суток!
Прошу у Вас помощи. Никак не могу разобраться, как работают сигналы вызовов из меню. Никак не могу сделать QObject::connect

Вот мой пример:

Код:
#include <QApplication>
#include <QtGui>
#include <QTextCodec>
#include <QMenuBar>
#include <QAction>
#include <QStatusBar>
#include <QObject>


/* Тестовое окно сообщения */
void show_info()
{
QMessageBox *message = new QMessageBox;
    message->information(NULL, "Окно сообщения", "<b>Тут текст и все такое</b><br>Ля-Ля-Ля");
    //message->exec();
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   
    /* Устанавливаем UTF-8 кодировку */
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec); 
   
    QWidget *wid = new QWidget;
    wid->setWindowTitle("Моя программа");
    wid->setGeometry(200,200,640,480);
   
    /* Создаем меню */
QMenuBar *menu = new QMenuBar;

QMenu *menu1 = new QMenu("&Файл");
QAction *mesaga = new QAction("Вызови меня", 0);
menu1->addAction(mesaga);
menu->addMenu(menu1);
[color=red]QObject::connect(mesaga, SIGNAL(triggered()), wid, SLOT(show_info()));[/color]

/* Создаем статусбар */
    QStatusBar *status = new QStatusBar;
    status->showMessage("здесь статусбар");

    QMdiArea *pole = new QMdiArea;
   
    /* Выстраиваем виджеты */
    QVBoxLayout *vb = new QVBoxLayout(wid);
vb->setMargin(0);
vb->setSpacing(2);
   
    vb->addWidget(menu);
vb->addWidget(pole);
    vb->addWidget(status);

    wid->showMaximized();
   
    return app.exec();
}

Помогите пожалуйста, кто может ! Заранее благодарю за ответы!


Название: Re: Сигналы из меню?
Отправлено: V1KT0P от Апрель 10, 2012, 00:08
Доброго времени суток!
Прошу у Вас помощи. Никак не могу разобраться, как работают сигналы вызовов из меню. Никак не могу сделать QObject::connect

Вот мой пример:

Код:
#include <QApplication>
#include <QtGui>
#include <QTextCodec>
#include <QMenuBar>
#include <QAction>
#include <QStatusBar>
#include <QObject>


/* Тестовое окно сообщения */
void show_info()
{
QMessageBox *message = new QMessageBox;
    message->information(NULL, "Окно сообщения", "<b>Тут текст и все такое</b><br>Ля-Ля-Ля");
    //message->exec();
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   
    /* Устанавливаем UTF-8 кодировку */
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec); 
   
    QWidget *wid = new QWidget;
    wid->setWindowTitle("Моя программа");
    wid->setGeometry(200,200,640,480);
   
    /* Создаем меню */
QMenuBar *menu = new QMenuBar;

QMenu *menu1 = new QMenu("&Файл");
QAction *mesaga = new QAction("Вызови меня", 0);
menu1->addAction(mesaga);
menu->addMenu(menu1);
[color=red]QObject::connect(mesaga, SIGNAL(triggered()), wid, SLOT(show_info()));[/color]

/* Создаем статусбар */
    QStatusBar *status = new QStatusBar;
    status->showMessage("здесь статусбар");

    QMdiArea *pole = new QMdiArea;
   
    /* Выстраиваем виджеты */
    QVBoxLayout *vb = new QVBoxLayout(wid);
vb->setMargin(0);
vb->setSpacing(2);
   
    vb->addWidget(menu);
vb->addWidget(pole);
    vb->addWidget(status);

    wid->showMaximized();
   
    return app.exec();
}

Помогите пожалуйста, кто может ! Заранее благодарю за ответы!
Ясное дело, у тебя ведь show_info() функция а не слот. Слоты можно делать только классам наследованным от QObject.


Название: Re: Сигналы из меню?
Отправлено: Javaca от Апрель 10, 2012, 00:10
Хорошо, а эту функцию из меню вызвать можно?


Название: Re: Сигналы из меню?
Отправлено: V1KT0P от Апрель 10, 2012, 00:34
Хорошо, а эту функцию из меню вызвать можно?
Вот так конектишь:
Код
C++ (Qt)
   MyFunctions func;
   QObject::connect(mesaga, SIGNAL(triggered()), &func, SLOT(showInfo()));
Вот класс:
myfunctions.h:
Код
C++ (Qt)
#ifndef MYFUNCTIONS_H
#define MYFUNCTIONS_H
 
#include <QObject>
 
class MyFunctions : public QObject
{
   Q_OBJECT
public:
   explicit MyFunctions(QObject *parent = 0);
 
signals:
 
public slots:
   void showInfo();
 
};
 
#endif // MYFUNCTIONS_H
myfunctions.cpp:
Код
C++ (Qt)
#include "myfunctions.h"
#include <QMessageBox>
 
MyFunctions::MyFunctions(QObject *parent) :
   QObject(parent)
{
}
 
void MyFunctions::showInfo()
{
   QMessageBox::information(NULL, "Окно сообщения", "<b>Тут текст и все такое</b><br>Ля-Ля-Ля");
}


Название: Re: Сигналы из меню?
Отправлено: Javaca от Апрель 10, 2012, 01:14
Что, в Qt нельзя вызвать функцию из меню без всяких заморочек? И это единственный метод, воротить не пойми что? В gtk делается легко и просто:

Код:
static void show_info(GtkWidget *widget, gpointer window)
{
  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Название жирными буквами", "title");
  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "Тут типа текст - Ля-Ля-Ля");
  gtk_window_set_title(GTK_WINDOW(dialog), "Это заголовок");
  gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(dialog);
}

Вызывается:

Код:
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()));
несколько короче, нежели приведённый пример с Gtk?

Как в 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)
{
  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Название жирными буквами", "title");
  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "Тут типа текст - Ля-Ля-Ля");
  gtk_window_set_title(GTK_WINDOW(dialog), "Это заголовок");
  gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(dialog);
}

Что, в GTK нельзя показать messagebox безо всяких заморочек? В Qt делается легко и просто:

Код
C++ (Qt)
QMessageBox::information(0, "hello", "hello");
 

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()));
несколько короче, нежели приведённый пример с Gtk?

И чем короче приведенный вами код от этого?  Кол-вом символов ;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 Кб.
О да на фоне библиотек весом минимум в 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
Могу с уверенностью заявить (и многие со мной согласятся), что "чем-нибудь другим" навряд ли доставит удовольствие
На востоке давно придумали более изящное решение - подмывание.  ;D

Javaca, чего вы хотите доказать? Что 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()
{
      QMdiSubWindow *subWindow = pole->addSubWindow(new QWidget);
      subWindow->show();
}


Название: Re: Сигналы из меню?
Отправлено: V1KT0P от Апрель 12, 2012, 18:58
А как мне в функцию передать pole ?  
QMdiArea *pole = new QMdiArea;  -> открыто в MainWindow !

Код:
void MainWindow::nahog()
{
      QMdiSubWindow *subWindow = pole->addSubWindow(new QWidget);
      subWindow->show();
}
Сделай pole членом класса MainWindow, и передавать не надо =).


Название: Re: Сигналы из меню?
Отправлено: Javaca от Апрель 12, 2012, 19:40
Сделай pole членом класса MainWindow, и передавать не надо =).

Тоесть?


Название: Re: Сигналы из меню?
Отправлено: V1KT0P от Апрель 12, 2012, 19:51
Сделай pole членом класса MainWindow, и передавать не надо =).

Тоесть?
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   QMdiArea *pole;
   Ui::MainWindow *ui;
};


Название: Re: Сигналы из меню?
Отправлено: Javaca от Апрель 12, 2012, 20:25
Код:
private:
    QMdiArea *pole;

Благодарю! Помогло.  :)


Название: 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() 
{
    qDebug() << "pressed";
}

QObject::connect(button, &QPushButton::clicked, 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

В последнем случае это будет выглядеть так:
Код
C++ (Qt)
class SomeClass
{
//...
   ssc::signal<void> clicked;
slots:
   void buttonClick() { clicked(); }
 
   QPushButton *m_btn;
};
 
// Далее в конструкторе класса SomeClass:
SomeClass::SomeClass()
{
   m_btn = new QPushButton("click me!");
   //...
   connect(m_btn, SIGNAL(clicked()), this, SLOT(buttonClick()));
   clicked.connect(someFunction);
}
 

И будет вам счастье)