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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: 1 слот и множество сигналов?  (Прочитано 16465 раз)
Даниил
Гость
« Ответ #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.073 секунд. Запросов: 23.