Название: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 17:04 Всем привет! Проблема следующая:
На форме есть объект txtLog (QTextBrowser), в который должны добавляться логи программы. Логи добавляются почти всеми исходными файлами в проекте. Объект txtLog содержится в классе UniStitch. Почитав про сигналы и слоты, я решил сделать так: в UniStitch добавить слот, добавляющий форматированный лог в txtLog, а в остальные исходники добавить в место отправки лог-информации emit logsignal(data) Но тут получается, что надо будет в каждом исходнике создавать экземпляр объекта UniStitch и делать для каждого сигнала connect? Или я что-то не понимаю? Пытался сделать всё без сигналов и слотов - при помощи статичной функции, но что-то возникли проблемы (писал до этого на C#), наверняка я что-то делаю не так :) Вообщем, подскажите решение возникшей проблемы, если не затруднит! Спасибо! С уважением, Андрей Название: Re: 1 слот и множество сигналов? Отправлено: Пантер от Августа 24, 2011, 17:07 Почитай (http://doc.qt.nokia.com/4.7-snapshot/debug.html) и не велосипедь. :)
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 17:10 Почитай (http://doc.qt.nokia.com/4.7-snapshot/debug.html) и не велосипедь. :) Конечно почитаю, только прошу ответ на мой вопрос, а не RTFM, а остальное я почерпну из документации ;)Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 17:15 А зачем вам в каждом исходнике создавать экземпляр? Для соединения достаточно указателя на уже существующий объект: вы создаёте UniStitch, а кому надо -- пускай просят указатель и соединяются, или как-то так. Возможно, имеет смысл воспользоваться статическими функциями, их ведь можно из любого места использовать.
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 17:22 А зачем вам в каждом исходнике создавать экземпляр? Для соединения достаточно указателя на уже существующий объект: вы создаёте UniStitch, а кому надо -- пускай просят указатель и соединяются, или как-то так. Возможно, имеет смысл воспользоваться статическими функциями, их ведь можно из любого места использовать. Вот кусок кода класса UniStitch: Код
Статичная функция foo() будет выполнять запись лога в txtLog, только проблема в том, что txtLog - не статичный, и его методы из статичной функции foo() НЕ доступны ... что посоветуете (новичку :) ) Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 17:36 Я не знаю... я всегда так делаю:
Код
Код и какой-нибудь Код
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 17:40 Я не знаю... я всегда так делаю: Код
Код и какой-нибудь Код
А как использовать класс Kitty из других классов? Придется в каждом объявлять свой экземпляр Kitty? Или создать в одном месте и передавать указатель на него, скажем в конструкторе? Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 17:44 А как использовать класс Kitty из других классов? Придется в каждом объявлять свой экземпляр Kitty? Или создать в одном месте и передавать указатель на него, скажем в конструкторе? Э.. а я думал, что Kitty - это якобы один из многих классов, которому нужно выводить сообщения в лог :)Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 18:09 Код Далее используем его вызывая Код Такой вариант устраивает? Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 18:13 Код Далее используем его вызывая Код Такой вариант устраивает? Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog :( Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 18:15 Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog :( А почему обязательно статические функции?Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 18:28 Мне нужно обращаться к нестатичному объекту txtLog. Те статичные функции, что вы написали, не смогут получить доступа к методам нестатичного txtLog :( А почему обязательно статические функции?Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах, которые будут использовать функцию лога из UniStitch p.s. Я приму любой интересный вариант решения моей проблемы, не обязательно с использованием статических функций Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 18:32 Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ... Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 18:41 Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ... Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.Я совсем запутался :-\ Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 18:50 Чтобы не создавать каждый раз новый экземпляр класса UniStitch в других классах ... Если я правильно понимаю вашу идею. То ваш класс, UniStitch изначально создается, т.к. выводит на форму объекты и до окончания работы программы он никуда не пропадает. Тогда в чем проблема? Надо что-то залогить - вызывается public метод класса UniStich и ему в качестве аргумента передается сообщение.Я совсем запутался :-\ Чтобы не путаться: есть форма, на ней текстовое поле (ну пускай QTextBrowser). В проекте много исходных файлов (и конечно же других классов) - каждый что-то должен написать в это текстовое поле. Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 18:55 surendil, такое ощущение, что это ты пишешь :) Очень тяжело читать код с непонятными названиями классов и методов, типа
Код
Непонято же, для чего ты их делаешь. А поводу основной проблемы: Код Когда нужно логить, просто вызываешь метод данного класса appendLog и заносишь инфу в виджет. И да, вопрос - почему класс статический? Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 19:22 Нарисовал идею в коде :) Спасибо Даниилу, теперь я умею прикреплять файлы :D
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 19:38 Цитировать И да, вопрос - почему класс статический? Моя ошибка, давно её исправил :) Сейчас UniStitch без staticЦитировать Когда нужно логить, просто вызываешь метод данного класса appendLog и заносишь инфу в виджет. Не все так просто - для того, чтобы вызвать метод, надо сначала получить к нему доступ:1. Если метод (appendLog) нестатичный, то придется создавать экземпляры класса, содержащего этот метод, для КАЖДОГО иного класса, использующего этот метод 2. Если метод (appendLog) статичный, то в нем НЕ можем обратиться к нестатичному объекту (виджету) Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 19:51 1. Если метод (appendLog) нестатичный, то придется создавать экземпляры класса, содержащего этот метод, для КАЖДОГО иного класса, использующего этот метод Стоп. Ты класс свой изначально вызываешь же? Он у тебя никуда не пропадает? Т.е. ты в любой точке программы можешь просто вызвать этот метод для УЖЕ созданного объекта класса?! Или я чего-то не понимаю? Название: Re: 1 слот и множество сигналов? Отправлено: Рома от Августа 24, 2011, 19:59 Попробуйте так:
Код: class UniStitch : public QMainWindow А для каждого класса, который будет отправлять сигнал, нужно сделать специальный конструктор например такой: Код: class A : public QObject И для всех екземпляров этого класса в качестве parent_unistitch ставить указатель на тот QTextBrowser в который нужно отправить лог. В этом случае не надо парится об создании сигналов/слотов, если в всех класах будете использовать конструктор такого рода, то сигналы/слоты будут настраиватся автоматически. Название: Re: 1 слот и множество сигналов? Отправлено: ecspertiza от Августа 24, 2011, 20:01 Сделай UniStitch синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 20:04 Цитировать Стоп. Ты класс свой изначально вызываешь же? Он у тебя никуда не пропадает? Т.е. ты в любой точке программы можешь просто вызвать этот метод для УЖЕ созданного объекта класса?! Или я чего-то не понимаю? Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ... Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 20:05 Сделай UniStitch синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект Да, на весь проект один объект QTextBrowser класса UniStitchЧто значит "синглтон" - просто я новичек не только в Qt, но и в C++ :) Это ? http://habrahabr.ru/blogs/cpp/116577/ Название: Re: 1 слот и множество сигналов? Отправлено: ecspertiza от Августа 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)
там и пример есть, грубо говоря, это когда создается один экземпляр класса на все приложение. Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 20:10 Сделай UniStitch синглтоном и не парься со статичными методами, если ты хочешь что бы как я понял UniStitch был один на весь проект О, здорово ^^Название: Re: 1 слот и множество сигналов? Отправлено: Igors от Августа 24, 2011, 20:12 Обычно делают так
Код Instance - static. Write2Log - нет Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 20:17 Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ... Никуда, никаких указателей передавать не нужно. Просто будет вызываться сразу два метода:Код
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 20:25 Тогда придется передавать указатель на этот класс в каждый другой класс, чтобы использовать метод appendLog() ... вот товарищ Рома предложил интересный (похожий, но чуточку удобнее) вариант ... сейчас обдумаю ... Никуда, никаких указателей передавать не нужно. Просто будет вызываться сразу два метода:Код
Название: Re: 1 слот и множество сигналов? Отправлено: Даниил от Августа 24, 2011, 20:39 А как я получу доступ к mainWindow из другого класса? Логика программы прояснилась. Мой вариант идет, только если в main'e танцевать с методами.Название: Re: 1 слот и множество сигналов? Отправлено: surendil от Августа 24, 2011, 21:09 Код
Код
Код
Код
В каждый .h файл класса, из которого нужно отправлять сообщения, я включаю logwidget.h. Использую так: Код
Это работает. А как правильно? Куда девается объект, который создаётся в Instance()? Я пробовал понять, но не получилось, поэтому просто из Википедии переписал :D Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 21:09 Обычно делают так Всё гениальное - просто? А ведь правда :)Код Instance - static. Write2Log - нет Спасибо Пантер (http://www.prog.org.ru/index.php?action=profile;u=4067), surendil (http://www.prog.org.ru/index.php?action=profile;u=11621), Даниил (http://www.prog.org.ru/index.php?action=profile;u=12212), Рома (http://www.prog.org.ru/index.php?action=profile;u=12221), ecspertiza (http://www.prog.org.ru/index.php?action=profile;u=7026) и конечно, Igors (http://www.prog.org.ru/index.php?action=profile;u=7236) за помощь - проблема решена! Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 21:12 Сделал проще, по совету Igors:
Код
Подключил unistitch.h ко всем *.cpp и использую так: Код
Название: Re: 1 слот и множество сигналов? Отправлено: Пантер от Августа 24, 2011, 21:16 Бррр. Это громоздко. Гораздо проще заюзать qDebug и написать свою функцию сохранения лога.
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 21:19 Бррр. Это громоздко. Гораздо проще заюзать qDebug и написать свою функцию сохранения лога. Через qInstallMsgHandler ?Название: Re: 1 слот и множество сигналов? Отправлено: Пантер от Августа 24, 2011, 21:22 Ага. Вот тебе пример:
Код
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 24, 2011, 21:26 Окей, учту и в следующем билде использую ваш вариант ... а он потоко-безопасен?
Название: Re: 1 слот и множество сигналов? Отправлено: Пантер от Августа 24, 2011, 21:31 Мой вариант использовать не нужно - это всего лишь пример. У меня в 3-х проектах разные варианты. На счет потокобезопасности - не знаю. По идее, да - потокобезопасен, если проинициализировать в main. Вот, кстати, еще вариант:
Код
Название: Re: 1 слот и множество сигналов? Отправлено: HunteX от Августа 25, 2011, 21:19 Повесил qInstallMsgHandler, запускаю обработку в отдельном потоке ... должны обрабатываться 7 изображений, а получаю только 6, причем если делаю брейкпоинт перед функцией вызова обработки, то считает все 7 ... думаю, что проблемы из-за доступа потока обработки к GUI (к компоненту QTextBrowser - запись в него логов) :( Может быть такое?
p.s. при отключении qInstallMsgHandler, все работает отлично. |