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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Есть ли в Qt аналог глобальных объектов как в PHP?  (Прочитано 20677 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Сейчас все так быстро меняется, что к тому же С++ например хорошо бы изучить еще криптографию, работу с устройствами например aladin, сотню другую разных вещей,
Людей которые занимаются "сотней разных вещей" обычно называют "летунами" и отношение к ним не очень хорошее  Улыбающийся
Записан
CuteBunny
Гость
« Ответ #16 : Июнь 15, 2012, 16:28 »

В Qt же есть глобальная переменная qApp - указатель на текущее приложение - всегда един, в теории можно от него создать потомка и положить туда какие-нибудь данные и создать методы для доступа к ним.

Поправьте, если не прав Непонимающий

З.Ы.: я бы наверное так все равно не стал делать... Улыбающийся
Записан
voron1980
Гость
« Ответ #17 : Июнь 15, 2012, 16:33 »

Вот то, о чем постоянно говорит Igors.. надо С++ учить ДО Qt, а не во время или после Улыбающийся

Цитировать
Все говорят, что плохо работать с классом по указателю, но разве лучше создавать отдельные экземпляры класса в разных местах, каждый сделает свое дело и не скажет об этом туда где создан другой экземпляр, у того свой сигнал.

не знаю кто они все, видимо те самые, которые врут.

"Глобальный" класс - может быть синглетон
Блин вот из за того что на верху было написано, не прочел то что ниже, сейчас нашел ту же ссылку через гугл http://blog.ufna.ru/2010/04/24/singleton-for-qt домен был как ник ufna.
В общем спасибо за ссылку.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #18 : Июнь 15, 2012, 16:38 »

facepalm.jpg
Записан
voron1980
Гость
« Ответ #19 : Июнь 16, 2012, 00:25 »

Попробовал создать singleton но как я предчувствовал он не глобальный, работает только в самом классе, подключить я его не могу поскольку просто выдается ошибки, перепробовал много вариантов, осталось еще бесконечность, в общем нереально понять для меня такое.
Вот пример под винду, программа запускается но переменная     MY_CLASS.ttt не создается по тому что когда я пытаюсь передать в класс MainWindow класс Test выдается куча ошибок.
В общем исходники прикрепил к посту, делал по этой статье,
http://blog.ufna.ru/2010/04/24/singleton-for-qt

в интернете есть еще всего одно место с примером,
http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern#Further_Reading
но там я в обще не уловил как это можно собрать.
Все больше примеров нет.
А если статическим классом сделать, будет он поддерживать сигналы и слоты?
Не получилось объявить статический класс, QT ругается на синтаксис
Код:
public static class Session {}
Записан
voron1980
Гость
« Ответ #20 : Июнь 16, 2012, 19:31 »

Наверное надо было в другую тему писать, все таки вопрос довольно сложный если нет ответов.
Пока не получилось сделать из класса наследуемого от qobject синглтон с сигналом, точней не получилось разнести код на h и cpp а без этого qt похоже думает, что это не сигнал а статическая процедура, сигнал это та же процедура без тела.
Купил книжку М.Самерфильда а там тоже ничего, похоже я попал в мир экстрасенсов  Смеющийся
Записан
alexis031182
Гость
« Ответ #21 : Июнь 16, 2012, 19:51 »

Наверное надо было в другую тему писать, все таки вопрос довольно сложный если нет ответов.
От перемены мест слагаемых сумма не меняется.

Пока не получилось сделать из класса наследуемого от qobject синглтон с сигналом, точней не получилось разнести код на h и cpp а без этого qt похоже думает, что это не сигнал а статическая процедура, сигнал это та же процедура без тела.
Купил книжку М.Самерфильда а там тоже ничего, похоже я попал в мир экстрасенсов  Смеющийся
Мне кажется, что Вы рановато взялись за паттерны. Для начала Вам необходимо очистить сознание от пых-пыха, иначе ничего хорошего не выйдет.
Код:
public static class Session {}
Имейте ввиду, что ООП в пхп бралось скорее с java, нежели с С, поэтому многие вещи, к которым Вы быть может привыкли, не могут быть реализованы в С-шной среде. Вы должны понимать, что если на пхп можно уже через неделю обучения с нуля почувствовать в себе дар написания собственных фреймворков, то на C таковое за столь короткий срок вряд ли случится.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #22 : Июнь 16, 2012, 19:53 »

а проблема-то в чем? вовсе не обязательно использовать класс уфны для синглтона.
Код
C++ (Qt)
class A : public QObject
{
public:
   static A &instance()
   {
       static A obj;
       return obj;
   }
 
signals:
   void mysignal();
 
private:
   A() {}
   Q_DISABLE_COPY(A)
};
...
connect(&A::instance(), SIGNAL(mysignal()), SLOT(someslot()));
« Последнее редактирование: Июнь 16, 2012, 19:54 от 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
voron1980
Гость
« Ответ #23 : Июнь 16, 2012, 20:44 »

а проблема-то в чем? вовсе не обязательно использовать класс уфны для синглтона.
не могу найти шаблон который можно использовать, ваш шаблон смог внедрить за несколько минут, но при запуске выдает сообщение
Цитировать
Object::connect: No such signal QObject::mysignal(int) in test2.cpp:10
&A::instance() получается не содержит необходимого сигнала mysignal
Мы передали объект по ссылке и одновременно про инициализировали или как то нужно это сделать до передачи а передать все таки уже объект типа A?
A * a = new A::instance();
test1.h
Код:
#ifndef TEST1_H
#define TEST1_H
#include <QObject>
#include <QtCore>
class A : public QObject
{
public:
    static A &instance()
    {
        static A obj;
        return obj;
    }
    void test(){
      emit mysignal(10); // сигнал пошлет 10
    }
signals:
    void mysignal(int n);
private:
    A() {}
    Q_DISABLE_COPY(A);
};
#endif // TEST1_H

test2.h
Код:
#ifndef TEST2_H
#define TEST2_H
#include <QObject>
#include <QDebug>
#include "test1.h";
class test2 : public QObject
{
    Q_OBJECT
public:
    explicit test2(QObject *parent = 0);
    void run();
signals:   
public slots:
    void forSignal(int n); // Слот который примет значение 10 и выведет в QDebug();
};
#endif // TEST2_H
test2.cpp
Код:
#include "test2.h"
#include "test1.h"
#include <QObject>
test2::test2(QObject *parent) :
    QObject(parent)
{
}
void test2::run()
{
    connect(&A::instance(),SIGNAL(mysignal(int)),this,SLOT(forSignal(int))); // тут возникает ошибка Object::connect: No such signal QObject::mysignal(int) in test2.cpp:10
}
void test2::forSignal(int n)
{
    qDebug() << n;
}
main.cpp
Код:
#include <QtCore/QCoreApplication>
#include <QtCore>
#include <QDebug>
#include "singleton.h"
#include "test1.h"
#include "test2.h"


class A;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test2 * ttt = new test2();
    ttt->run(); // тут я запускаю метод который делает connect между слотом и сигналом.
    return a.exec();
}

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

Сообщений: 4732



Просмотр профиля WWW
« Ответ #24 : Июнь 16, 2012, 21:46 »

мне умный компилятор подсказал в чем проблема и не дал проекту скомпилироваться:
Цитировать
..\hello\hello.cpp(21): Error: Class declarations lacks Q_OBJECT macro.
как только ты добавишь Q_OBJECT в класс A, всё сразу заработает (не забудь только после ttt->run() написать A::instance().test())
Записан

Изучением 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
voron1980
Гость
« Ответ #25 : Июнь 16, 2012, 22:23 »

мне умный компилятор подсказал в чем проблема и не дал проекту скомпилироваться:
Цитировать
..\hello\hello.cpp(21): Error: Class declarations lacks Q_OBJECT macro.
как только ты добавишь Q_OBJECT в класс A, всё сразу заработает (не забудь только после ttt->run() написать A::instance().test())
К стати забыл что его нужно вызвать было, но это после успешного соединения слотов.
A::instance().test()
Добавил в класс A
Код:
class A : public QObject
{
    Q_OBJECT ............
Но теперь проект не компилируется
Предлагает покопаться в HEX кодах test2.o и не находит референс на класс А
Цитировать
G:\Programs\QT_Project\SingletonTest1/test1.h:6: undefined reference to `vtable for A'
debug/test2.o: In function `A':
G:\Programs\QT_Project\SingletonTest1/test1.h:20: undefined reference to `vtable for A'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: *** [debug\SingletonTest1.exe] Error 1
mingw32-make.exe: *** [debug] Error 2
пока закоментил
    //ttt->run();
    //A::instance().test();
Я приложил файл к сообщению, там проект что бы не гадать если хотите посмотреть, а сообщение Error: Class declarations lacks Q_OBJECT macro. у меня выдается только после того как я за комментировал     //ttt->run();
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #26 : Июнь 16, 2012, 23:00 »

избавься от singleton.h – после этого всё будет работать. ну и в данном случае ttt лучше создавать на стеке (т.е. не делать указателем).

и в test2.h:5 убери ; – после инклудов точку с запятой не ставят.
« Последнее редактирование: Июнь 16, 2012, 23:02 от 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
voron1980
Гость
« Ответ #27 : Июнь 16, 2012, 23:35 »

избавься от singleton.h – после этого всё будет работать. ну и в данном случае ttt лучше создавать на стеке (т.е. не делать указателем).

и в test2.h:5 убери ; – после инклудов точку с запятой не ставят.
Да все заработало спасибо, вот она какая глобальная переменная на самом деле, если сравнить с PHP
GLOBAL $VAR = 123;
А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #28 : Июнь 17, 2012, 01:35 »

создать переменную на стеке значит объявить её не указателем. пойди поучи C++.
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Июнь 17, 2012, 02:28 »

А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще?
Стек - область/кусок памяти для хранения временных данных. Компилятор автоматычно размещает все локальные переменные на стеке, при выходе из ф-ции эта память освобождается.

Хз как можно программировать (пусть на PHP) не зная что такое стек, регистры, команды  Непонимающий Непонимающий
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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