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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: 1 слот и множество сигналов?  (Прочитано 15462 раз)
HunteX
Гость
« : Август 24, 2011, 17:04 »

Всем привет! Проблема следующая:
На форме есть объект txtLog (QTextBrowser), в который должны добавляться логи программы. Логи добавляются почти всеми исходными файлами в проекте.

Объект txtLog содержится в классе UniStitch.
Почитав про сигналы и слоты, я решил сделать так: в UniStitch добавить слот, добавляющий форматированный лог в txtLog, а в остальные исходники добавить в место отправки лог-информации emit logsignal(data)

Но тут получается, что надо будет в каждом исходнике создавать экземпляр объекта UniStitch и делать для каждого сигнала connect? Или я что-то не понимаю? Пытался сделать всё без сигналов и слотов - при помощи статичной функции, но что-то возникли проблемы (писал до этого на C#), наверняка я что-то делаю не так Улыбающийся Вообщем, подскажите решение возникшей проблемы, если не затруднит! Спасибо!

С уважением,
Андрей
« Последнее редактирование: Август 24, 2011, 17:07 от HunteX » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

Почитай и не велосипедь. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
HunteX
Гость
« Ответ #2 : Август 24, 2011, 17:10 »

Почитай и не велосипедь. Улыбающийся
Конечно почитаю, только прошу ответ на мой вопрос, а не RTFM, а остальное я почерпну из документации Подмигивающий
Записан
surendil
Гость
« Ответ #3 : Август 24, 2011, 17:15 »

А зачем вам в каждом исходнике создавать экземпляр? Для соединения достаточно указателя на уже существующий объект: вы создаёте UniStitch, а кому надо -- пускай просят указатель и соединяются, или как-то так. Возможно, имеет смысл воспользоваться статическими функциями, их ведь можно из любого места использовать.
Записан
HunteX
Гость
« Ответ #4 : Август 24, 2011, 17:22 »

А зачем вам в каждом исходнике создавать экземпляр? Для соединения достаточно указателя на уже существующий объект: вы создаёте UniStitch, а кому надо -- пускай просят указатель и соединяются, или как-то так. Возможно, имеет смысл воспользоваться статическими функциями, их ведь можно из любого места использовать.

Вот кусок кода класса UniStitch:
Код
C++ (Qt)
static class UniStitch : public QMainWindow
{
Q_OBJECT
 
public:
explicit UniStitch(QWidget *parent = 0);
~UniStitch();
 
static void foo(QString logLine);

Статичная функция foo() будет выполнять запись лога в txtLog, только проблема в том, что txtLog - не статичный, и его методы из статичной функции foo() НЕ доступны ... что посоветуете (новичку Улыбающийся )
Записан
surendil
Гость
« Ответ #5 : Август 24, 2011, 17:36 »

Я не знаю... я всегда так делаю:
Код
C++ (Qt)
class UniStitch : public QMainWindow
{
 Q_OBJECT
public:
 explicit UniStitch(QWidget *parent = 0);
public slots:
 void foo(QString logLine) { txtLog->append(logLine); }
private:
 QTextBrowser *txtLog;

Код
C++ (Qt)
class Kitty : public QObject
{
 Q_OBJECT
public:
 explicit Kitty(QObject *parent = 0);
signals:
 void mew(QString msg);
};
и какой-нибудь
Код
C++ (Qt)
int main(/*int argc, char *argv[]*/)
{
 // ...
 UniStitch us;
 Kitty k;
 QObject::connect( &k, SIGNAL(mew(QString)),
                   &us, SLOT(foo(QString)) );
}
Записан
HunteX
Гость
« Ответ #6 : Август 24, 2011, 17:40 »

Я не знаю... я всегда так делаю:
Код
C++ (Qt)
class UniStitch : public QMainWindow
{
 Q_OBJECT
public:
 explicit UniStitch(QWidget *parent = 0);
public slots:
 void foo(QString logLine) { txtLog->append(logLine); }
private:
 QTextBrowser *txtLog;

Код
C++ (Qt)
class Kitty : public QObject
{
 Q_OBJECT
public:
 explicit Kitty(QObject *parent = 0);
signals:
 void mew(QString msg);
};
и какой-нибудь
Код
C++ (Qt)
int main(/*int argc, char *argv[]*/)
{
 // ...
 UniStitch us;
 Kitty k;
 QObject::connect( &k, SIGNAL(mew(QString)),
                   &us, SLOT(foo(QString)) );
}

А как использовать класс Kitty из других классов? Придется в каждом объявлять свой экземпляр Kitty? Или создать в одном месте и передавать указатель на него, скажем в конструкторе?
« Последнее редактирование: Август 24, 2011, 17:42 от HunteX » Записан
surendil
Гость
« Ответ #7 : Август 24, 2011, 17:44 »

А как использовать класс Kitty из других классов? Придется в каждом объявлять свой экземпляр Kitty? Или создать в одном месте и передавать указатель на него, скажем в конструкторе?
Э.. а я думал, что Kitty - это якобы один из многих классов, которому нужно выводить сообщения в лог Улыбающийся
Записан
Даниил
Гость
« Ответ #8 : Август 24, 2011, 18:09 »

Код
C++ (Qt)
class Log
{
public:
   static void ToFile(QString msg);                            
 
   static void ToFileName(QString fileName, QString msg);      
};
 
Далее используем его вызывая
Код
C++ (Qt)
Log::ToFile(QString msg);
 
Такой вариант устраивает?
Записан
HunteX
Гость
« Ответ #9 : Август 24, 2011, 18:13 »

Код
C++ (Qt)
class Log
{
public:
   static void ToFile(QString msg);                            
 
   static void ToFileName(QString fileName, QString msg);      
};
 
Далее используем его вызывая
Код
C++ (Qt)
Log::ToFile(QString msg);
 
Такой вариант устраивает?

Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog Грустный
Записан
surendil
Гость
« Ответ #10 : Август 24, 2011, 18:15 »

Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog Грустный
А почему обязательно статические функции?
Записан
HunteX
Гость
« Ответ #11 : Август 24, 2011, 18:28 »

Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog Грустный
А почему обязательно статические функции?

Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах, которые будут использовать функцию лога из UniStitch

p.s. Я приму любой интересный вариант решения моей проблемы, не обязательно с использованием статических функций
Записан
Даниил
Гость
« Ответ #12 : Август 24, 2011, 18:32 »

Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ...
Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.
Записан
surendil
Гость
« Ответ #13 : Август 24, 2011, 18:41 »

Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ...
Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.
Проблема в том, что запись в лог нужно делать из кучи других классов, и в каждом придётся держать указатель на UniStitch. У меня идея сделать UniStitch::foo(QString) слотом, а другим классам написать сигнал bar(QString), который бы отправлялся по надобности записи в лог - тогда остаётся соединить все классы с экземпляром UniStitch.
Я совсем запутался В замешательстве
Записан
HunteX
Гость
« Ответ #14 : Август 24, 2011, 18:50 »

Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ...
Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.
Проблема в том, что запись в лог нужно делать из кучи других классов, и в каждом придётся держать указатель на UniStitch. У меня идея сделать UniStitch::foo(QString) слотом, а другим классам написать сигнал bar(QString), который бы отправлялся по надобности записи в лог - тогда остаётся соединить все классы с экземпляром UniStitch.
Я совсем запутался В замешательстве

Чтобы не путаться: есть форма, на ней текстовое поле (ну пускай QTextBrowser). В проекте много исходных файлов (и конечно же других классов) - каждый что-то должен написать в это текстовое поле.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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