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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: 1 слот и множество сигналов?  (Прочитано 15460 раз)
Даниил
Гость
« Ответ #15 : Август 24, 2011, 18:55 »

surendil, такое ощущение, что это ты пишешь Улыбающийся Очень тяжело читать код с непонятными названиями классов и методов, типа
Код
C++ (Qt)
class UniStitch;
static void foo(QString logline);
 

Непонято же, для чего ты их делаешь.
А поводу основной проблемы:
Код
C++ (Qt)
static class UniStitch : public QMainWindow
{
Q_OBJECT
 
public:
explicit UniStitch(QWidget *parent = 0);
~UniStitch();
 
void appendLog(QString logLine);
 
private:
txtLog QTextBrowser;
}
 
Когда нужно логить, просто вызываешь метод данного класса appendLog и заносишь инфу в виджет.
И да, вопрос - почему класс статический?
Записан
surendil
Гость
« Ответ #16 : Август 24, 2011, 19:22 »

Нарисовал идею в коде Улыбающийся Спасибо Даниилу, теперь я умею прикреплять файлы Веселый
« Последнее редактирование: Август 24, 2011, 19:39 от surendil » Записан
HunteX
Гость
« Ответ #17 : Август 24, 2011, 19:38 »

Цитировать
И да, вопрос - почему класс статический?
Моя ошибка, давно её исправил Улыбающийся Сейчас UniStitch без static

Цитировать
Когда нужно логить, просто вызываешь метод данного класса appendLog и заносишь инфу в виджет.
Не все так просто - для того, чтобы вызвать метод, надо сначала получить к нему доступ:
1. Если метод (appendLog) нестатичный, то придется создавать экземпляры класса, содержащего этот метод, для КАЖДОГО иного класса, использующего этот метод
2. Если метод (appendLog) статичный, то в нем НЕ можем обратиться к нестатичному объекту (виджету)
« Последнее редактирование: Август 24, 2011, 19:45 от HunteX » Записан
Даниил
Гость
« Ответ #18 : Август 24, 2011, 19:51 »

1. Если метод (appendLog) нестатичный, то придется создавать экземпляры класса, содержащего этот метод, для КАЖДОГО иного класса, использующего этот метод
Стоп. Ты класс свой изначально вызываешь же? Он у тебя никуда не пропадает? Т.е. ты в любой точке программы можешь просто вызвать этот метод для УЖЕ созданного объекта класса?!
Или я чего-то не понимаю?
Записан
Рома
Гость
« Ответ #19 : Август 24, 2011, 19:59 »

Попробуйте так:
Код:
class UniStitch : public QMainWindow
{
Q_OBJECT
 
public:
explicit UniStitch(QWidget *parent = 0);
~UniStitch();
 
public slots:
void foo(QString logLine);

А для каждого класса, который будет отправлять сигнал, нужно сделать специальный конструктор например такой:

Код:
class A : public QObject
{
Q_OBJECT

signals:
      mew(QString);

public:
        A(QObject *parent, UniStitch *parent_unistitch) :QObject(parent)
        {
                 connect(this,SIGNAL(mew(QString)),parent_unistitch,SLOT(foo(QString)));
        }
};

И для всех екземпляров этого класса в качестве parent_unistitch ставить указатель на тот QTextBrowser в который нужно отправить лог. В этом случае не надо парится об создании сигналов/слотов, если в всех класах будете использовать конструктор такого рода, то сигналы/слоты будут настраиватся автоматически.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #20 : Август 24, 2011, 20:01 »

Сделай UniStitch  синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект
Записан
HunteX
Гость
« Ответ #21 : Август 24, 2011, 20:04 »

Цитировать
Стоп. Ты класс свой изначально вызываешь же? Он у тебя никуда не пропадает? Т.е. ты в любой точке программы можешь просто вызвать этот метод для УЖЕ созданного объекта класса?!
Или я чего-то не понимаю?

Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ...
Записан
HunteX
Гость
« Ответ #22 : Август 24, 2011, 20:05 »

Сделай UniStitch  синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект
Да, на весь проект один объект QTextBrowser класса UniStitch
Что значит "синглтон" - просто я новичек не только в Qt, но и в C++ Улыбающийся

Это ? http://habrahabr.ru/blogs/cpp/116577/
« Последнее редактирование: Август 24, 2011, 20:09 от HunteX » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #23 : Август 24, 2011, 20:08 »

вот http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

там и пример есть, грубо говоря, это когда создается один экземпляр класса на все приложение.
Записан
surendil
Гость
« Ответ #24 : Август 24, 2011, 20:10 »

Сделай UniStitch  синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект
О, здорово ^^
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Август 24, 2011, 20:12 »

Обычно делают так

Код
C++ (Qt)
// из любого места
UniStitch::Instance()->Write2Log("abc");
 
Instance - static. Write2Log - нет
Записан
Даниил
Гость
« Ответ #26 : Август 24, 2011, 20:17 »

Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ...
Никуда, никаких указателей передавать не нужно. Просто будет вызываться сразу два метода:
Код
C++ (Qt)
//LogData - return QString;
mainWindow->appendLog(client->LogData());
 
Записан
HunteX
Гость
« Ответ #27 : Август 24, 2011, 20:25 »

Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ...
Никуда, никаких указателей передавать не нужно. Просто будет вызываться сразу два метода:
Код
C++ (Qt)
//LogData - return QString;
mainWindow->appendLog(client->LogData());
 
А как я получу доступ к mainWindow из другого класса?
Записан
Даниил
Гость
« Ответ #28 : Август 24, 2011, 20:39 »

А как я получу доступ к mainWindow из другого класса?
Логика программы прояснилась. Мой вариант идет, только если в main'e танцевать с методами.
Записан
surendil
Гость
« Ответ #29 : Август 24, 2011, 21:09 »

Код
C++ (Qt)
// unistitch.h
#include <QMainWindow>
#include <logwidget.h>
class UniStitch : public QMainWindow
{
 Q_OBJECT
public:
 explicit UniStitch(QWidget *parent = 0);
private:
 QTextBrowser *txtLog;
};
Код
C++ (Qt)
// unistitch.cpp
UniStitch::UniStitch(QWidget */*parent*/)
 : txtLog(NULL)
{
 txtLog = LogWidget::Instance();
 setCentralWidget(txtLog);
}
Код
C++ (Qt)
// logwidget.h
#include <QTextBrowser>
class LogWidget : public QTextBrowser
{
 LogWidget(){}
public:
 static LogWidget *Instance()
 {
   if( m_instance == NULL )
     m_instance = new LogWidget;
   return m_instance;
 }
private:
 static LogWidget *m_instance;
};
Код
C++ (Qt)
// logwidget.cpp
#include "logwidget.h"
LogWidget* LogWidget::m_instance = NULL;

В каждый .h файл класса, из которого нужно отправлять сообщения, я включаю logwidget.h. Использую так:
Код
C++ (Qt)
LogWidget::Instance()->append("Hello, World!");

Это работает. А как правильно? Куда девается объект, который создаётся в Instance()?
Я пробовал понять, но не получилось, поэтому просто из Википедии переписал Веселый
« Последнее редактирование: Август 24, 2011, 21:12 от surendil » Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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