crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в вопрос по сигналам и слотам
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 3.9.2009, 16:00
 
Цитата(BRE @ 3.9.2009, 19:10) *
Ты имеешь ввиду - не учтена reich?
угу
BRE Дата 3.9.2009, 15:10
 
Цитата(Litkevich Yuriy @ 3.9.2009, 15:46) *
эта особенность просто не учтена.

Ты имеешь ввиду - не учтена reich?

Я почему поднял эту тему. По мне, так такой подход в использовании singleton'ов чреват ошибками. Легко обнаруживаемыми и не очень.
Singleton может вовсе не гарантировать, что указатель на объект который вернул метод instance, в дальнейшем будет валиден.
Obj *obj1 = Object::instance();
// Что-то делаем, например вызываем какой нибудь статический Object::reload().
Obj *obj2 = Object::instance();

// Вот здесь obj1 может быть не равен obj2

Поэтому, сохраняя указатель на такой объект, а в дальнейшем его использование чревато тем, что указатель будет указывать на убитый или не валидный объект.
В случае с QCoreApplication это как раз и не вызовет особых проблем, но практика по моему опасна.
Litkevich Yuriy Дата 3.9.2009, 14:46
 
Цитата(BRE @ 3.9.2009, 15:20) *
Для чего может понадобиться сохранять указатель на singleton?
эта особенность просто не учтена.
И в Qt поменьшей мере два подобных класса:
QSqlDatabase
QCoreApplication
BRE Дата 3.9.2009, 11:20
 
Цитата(reich @ 3.9.2009, 12:14) *
Пердоставленный выше пример никаких. Было бы короче записать твой вариант. Но я же говорю, что привык писать по другому.

Любой другой пример....
Для чего может понадобиться сохранять указатель на singleton?
Мы не ищем легких путей? Потенциально тонкий момент, нужно не забывать вызывать setInstance().
Зачем?

Я не прикалываюсь, действительно не понимаю... ;)
reich Дата 3.9.2009, 11:14
 
Цитата(BRE @ 3.9.2009, 11:11) *
Цитата(reich @ 3.9.2009, 12:01) *
BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication

Интересно, а какие нужды позволяет сделать твой метод передачи по сравнению с ...
QApplication *app = QCoreApplication::instance();
app->....

или просто

qApp->...


Серьезно, не пойму...


Пердоставленный выше пример никаких. Было бы короче записать твой вариант. Но я же говорю, что привык писать по другому.
BRE Дата 3.9.2009, 11:11
 
Цитата(reich @ 3.9.2009, 12:01) *
BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication

Интересно, а какие нужды позволяет сделать твой метод передачи по сравнению с ...
QApplication *app = QCoreApplication::instance();
app->....

или просто

qApp->...


Серьезно, не пойму...
Какой смысл передавать и хранить указатель, который можно получить в любом месте?
Причем нужно помнить, что нужно вызвать setInstance().
:blink:
reich Дата 3.9.2009, 11:01
  BRE, я привык так делать, потому, что есть иногда другие нужды в использовании QCoreApplication
BRE Дата 3.9.2009, 9:30
 
Цитата(reich @ 3.9.2009, 9:51) *
Бред полнейший. Прочитайте хотябы пол книги по Qt и Вы поймете, как рисовать GUI

:) ;)

Цитата(reich @ 3.9.2009, 9:51) *
Вот простой пример, как этим пользоваться:
//main.cpp
int main( int argc, char *argv[] ){
    ...
    wdg.setInstance( app.instance() );
    ...
}

void Widget::setInstance(QCoreApplication *__app){
    connect( _ui.pushButton, SIGNAL( clicked() ), __app, SLOT( quit() ) );
}

Для чего такие сложные телодвижения для получения указателя на QApplication?
Почитай про:
QCoreApplication * QCoreApplication::instance () [static]
и макрос qApp.
reich Дата 3.9.2009, 8:51
 
Цитата(deex @ 3.9.2009, 7:44) *
кто ж мог подумать что связка Eclipse + QT мешает, а не помогает
обычный С++ я пишу в Эклипсе и мне он очень облегчает жизнь

Бред полнейший. Прочитайте хотябы пол книги по Qt и Вы поймете, как рисовать GUI

Вот простой пример, как этим пользоваться:
//main.cpp
#include <QtGui/QApplication>

#include "widget.h"



int main( int argc, char *argv[] ){
    QApplication app( argc, argv );
    Widget wdg;
    wdg.setInstance( app.instance() );
    wdg.setVisible( true );
    return app.exec();
}

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "ui_widget.h"

class QCoreApplication;

class Widget : public QWidget{

    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public:
    void setInstance( QCoreApplication *__app );

private:
    Ui::WidgetClass _ui;

};

#endif // WIDGET_H


//widget.cpp
#include "widget.h"

#include <QtCore/QCoreApplication>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    _ui.setupUi(this);
}

Widget::~Widget()
{

}

void Widget::setInstance(QCoreApplication *__app){
    connect( _ui.pushButton, SIGNAL( clicked() ), __app, SLOT( quit() ) );
}
deex Дата 3.9.2009, 7:44
  кто ж мог подумать что связка Eclipse + QT мешает, а не помогает
обычный С++ я пишу в Эклипсе и мне он очень облегчает жизнь
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 3.4.2020, 13:06