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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Сигналы из меню?  (Прочитано 19829 раз)
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();
}

Помогите пожалуйста, кто может ! Заранее благодарю за ответы!
Записан
V1KT0P
Гость
« Ответ #1 : Апрель 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.
Записан
Javaca
Гость
« Ответ #2 : Апрель 10, 2012, 00:10 »

Хорошо, а эту функцию из меню вызвать можно?
Записан
V1KT0P
Гость
« Ответ #3 : Апрель 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>Ля-Ля-Ля");
}
Записан
Javaca
Гость
« Ответ #4 : Апрель 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 по человечески из меню вызвать нужную функцию?
Записан
alexis031182
Гость
« Ответ #5 : Апрель 10, 2012, 07:59 »

Что, в Qt нельзя вызвать функцию из меню без всяких заморочек? И это единственный метод, воротить не пойми что? В gtk делается легко и просто:
...
Мне одному показалось, что вот это:
Код:
QObject::connect(mesaga, SIGNAL(triggered()), &func, SLOT(showInfo()));
несколько короче, нежели приведённый пример с Gtk?

Как в Qt по человечески из меню вызвать нужную функцию?
Слот - это функция, которая также, как и любая другая функция C++ подчиняется соответствующим правилам языка. Просто к слоту, в дополнение, можно подключать сигналы.
Записан
Alex_C
Гость
« Ответ #6 : Апрель 10, 2012, 09:39 »

Что, в Qt нельзя вызвать функцию из меню без всяких заморочек?

Слот - это и есть самая обычная ф-ция. В чем заморочка? В определении ф-ции написать ключевое слово slots?

Мне одному показалось, что вот это:

Нет Улыбающийся Мне вообще кажется, что на Qt все максимально просто и понятно, в отличии того же gtk.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Апрель 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. Вечный спор.
Записан
Bepec
Гость
« Ответ #8 : Апрель 10, 2012, 09:52 »

Отнюдь не вечный Подмигивающий

Достаточно просто сравнить время освоения Qt и GTK.

Сотни параметров, зачастую ненужных. Универсальность - да, многофункциональность - да, удобство - нееее.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Апрель 10, 2012, 10:14 »

Как в Qt по человечески из меню вызвать нужную функцию?
А по-человечески в Qt всё делается очень просто:
заводится производный от QMainWindow класс, в который помещается ваш show_info() слот и не сваливается всё в кучу в main().
Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Апрель 10, 2012, 11:38 »

Человек не понимает ООП подхода.
Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто.
Записан
alexis031182
Гость
« Ответ #11 : Апрель 10, 2012, 11:54 »

Человек не понимает ООП подхода.
Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто.
"лямбдам"? Можно подробнее? Что это?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 10, 2012, 12:00 »

Ну почему сразу "не понимает". Просто "учиться легко - трудно переучиваться". Этот эффект возникает всегда при переходе на новый инструментарий. Действительно почему здесь можно только через слот/сигнал? Это может быть неудобно! При этом как-то забывается что иметь массу статиков которых "ни пришей - ни пристегни", мягко говоря, не очень красиво и никак не удобнее. Но там как бы уже привык не обращать внимания на запах - а здесь еще нет  Улыбающийся
Записан
iroln
Гость
« Ответ #13 : Апрель 10, 2012, 12:17 »

Человек не понимает ООП подхода.
Кстати в пятерке можно будет коннектиться к лямбдам, что вообще круто.
А В PyQt/PySide это сразу  было Показает язык.
Поэтому холивар разводить по поводу, что круче и удобнее gtk или qt бессмысленно, потому что Python круче!  Смеющийся

Цитировать
ноги, крылья... - главное хвост!
Записан
iroln
Гость
« Ответ #14 : Апрель 10, 2012, 12:20 »

"лямбдам"? Можно подробнее? Что это?
http://ru.wikipedia.org/wiki/Анонимная_функция
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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