Russian Qt Forum
Ноябрь 25, 2024, 12:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: какой виртуальный метод вызывается после передачи сигнала?  (Прочитано 10044 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 29, 2010, 14:42 »

вопрос в заголовке возможно не очень прозрачен, поэтому пояснение:

есть приложение с меню и кнопками на тулбарах, пункты меню посылают сигналы туда, куда подключены

слоты-приемники сигналов вызывают разнообразную внутреннюю обработку данных, во время которой могут происходить различные ошибки, код которых устанавливается в глобальной переменной

после обработки сигналов необходимо выдавать сообщение об ошибке, при этом более чем в половине случаев невозможно выдать это сообщение, поскольку код устанавливается библиотечными функциями

можно в каждый приемник сигнала влепить выдачу сообщений об ошибке после обработки любого сигнала - но это очень не красиво, поскольку слотов для приема сигнала десятки, и при добавлении каждого нового потребуется выдача такого сообщения

каким образом можно получить управление после того, как любой сигнал был обработан его приемником, независимо от того, откуда он был послан? все описанные сигналы и приемники находятся в одной нити приложения, но сигналы посылаются разными объектами
Записан

2^7-1 == 127, задумайтесь...
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Апрель 29, 2010, 15:15 »

Если я все правильно понял, то можно использовать QSignalMapper. Т.е. все твои виджеты будут посылать сигналы в один слот, оттуда определяя что это за объект вызываем нужную функцию обработки, а затем после возврата из функции выполняем нужные действия(в слоте), т.е. как и надо получаем управление. Незнаю подойдет ли это в вашем случае..
В ассистенте можно почитать: Advanced Signals and Slots Usage
Ну и соответственно описание класса QSignalMapper.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
spectre71
Гость
« Ответ #2 : Апрель 29, 2010, 15:17 »

Как вариант, можно переопределить CoreApplication::notify и делать проверки там.

Тупой пример:

Код
C++ (Qt)
class MyApplication : public QApplication{
   Q_OBJECT
 public:
   bool IsError;
 public:
   MyApplication (int& argc, char** argv) : QApplication(argc, argv) {MyGlobalError = false;}
   bool notify ( QObject * receiver, QEvent * event);
};
 
int main(int argc, char *argv[]) {
//...
//...
 MyApplication a(argc, argv);
//...
//...
 return a.exec();
}
 
bool MyApplication::notify ( QObject * receiver, QEvent * event ) {
   bool Res = QApplication::notify(receiver, event);
   if(IsError) {
     IsError= false;
     QMessageBox::information(0, QObject::tr("information"), "Error");
   }
   return Res;
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 29, 2010, 15:18 »

Я бы ставил так

Код
C++ (Qt)
// один из обработчиков
...
if (theErrorHandler.GetError() != errNone)  // ошибка уже случилась, уходим    
return theErrorHandler.GetError();
...
int err = MyLibCal(..);                     // работаем с библиотеками и.т.п.
if (err != errNone)                         // проверяем на ошибку
return theErrorHandler.SetError(err);      // устанавливаем ошибку и уходим
...
 
// ErrorHandler
int ErrorHandler::GetError( void ) const
{
return mErrorCode;
}
 
int ErrorHandler::SetError( int errCode )
{
static QMutex mutex;
QMutexLocker(&mutex);
if (mErrorCode == noErr) {
 mErrorCode = errCode;
 emit ShowError(this);                    // QueuedConnection
}
}
 
ErrorHandler theErrorHandler;             // глобальная переменная
 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Апрель 29, 2010, 15:53 »

че-то не нравится ни один предложенный вариант  Грустный

лучше всего, если бы можно было переопределить приложение, а там виртуальный метод что-нибудь вроде AfterSignalProcessed(), который вызывается каждый раз, когда завершился любой обработчик любого сигнала

такого нет?
Записан

2^7-1 == 127, задумайтесь...
Kolobok
Гость
« Ответ #5 : Апрель 29, 2010, 17:17 »

Тип соединения у тебя DirectConnection. Значит, на следующей строчке после emit слот уже выполнится. Вот и посылай после первого сигнала второй, что сигнал обработан.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Апрель 29, 2010, 18:56 »

Тип соединения у тебя DirectConnection. Значит, на следующей строчке после emit слот уже выполнится. Вот и посылай после первого сигнала второй, что сигнал обработан.

откуда посылать? из слота? из функции, делающей emit? слотов несколько десятков, мест для emit еще больше, и на множество слотов сигналы идут из меню приложения, от разных кнопок и прочих виджетов, созданных в QtDesigner
Записан

2^7-1 == 127, задумайтесь...
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #7 : Апрель 29, 2010, 19:08 »

Цитировать
откуда посылать? из слота? из функции, делающей emit? слотов несколько десятков, мест для emit еще больше, и на множество слотов сигналы идут из меню приложения, от разных кнопок и прочих виджетов, созданных в QtDesigner
Kolobok имеет ввиду после каждого сигнала высылай другой сигнал, что тот уже обработан.
Ну и еще остается вариант практически такой же - это в конце слота обработки сигнала вызывать какую-либо функцию или опять же отсылать сигнал, что тот уже обработан.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
spectre71
Гость
« Ответ #8 : Апрель 29, 2010, 19:27 »

Тип соединения у тебя DirectConnection. Значит, на следующей строчке после emit слот уже выполнится. Вот и посылай после первого сигнала второй, что сигнал обработан.

Что попало. И как интересно получится продублировать сигналы из внутри методов класовв QT библиотеки. Улыбающийся
Записан
Kolobok
Гость
« Ответ #9 : Апрель 29, 2010, 19:29 »

Код:
connect( button, SIGNAL( clicked() ), obj1, SLOT( slot() ) );
connect( button, SIGNAL( clicked() ), obj2, SLOT( slot() ) );

Слоты выполнятся в той последовательности, как они были соединены. В данном примере сначала obj1->slot(), потом obj2->slot().
Записан
spectre71
Гость
« Ответ #10 : Апрель 29, 2010, 19:29 »

че-то не нравится ни один предложенный вариант  Грустный

лучше всего, если бы можно было переопределить приложение, а там виртуальный метод что-нибудь вроде AfterSignalProcessed(), который вызывается каждый раз, когда завершился любой обработчик любого сигнала

такого нет?

1) Чем тебе не нравятся предложенные варианты. Поясни.
2) Уточни что за обработка ошибок, в каких случаях, ...

Записан
spectre71
Гость
« Ответ #11 : Апрель 29, 2010, 19:37 »

Код:
connect( button, SIGNAL( clicked() ), obj1, SLOT( slot() ) );
connect( button, SIGNAL( clicked() ), obj2, SLOT( slot() ) );

Слоты выполнятся в той последовательности, как они были соединены. В данном примере сначала obj1->slot(), потом obj2->slot().

1) Возможно и так(не уточнял), но только для однопотокого приложения! Улыбающийся
2) Очень плохой способ дублировать сединения.


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 29, 2010, 19:45 »

лучше всего, если бы можно было переопределить приложение, а там виртуальный метод что-нибудь вроде AfterSignalProcessed(), который вызывается каждый раз, когда завершился любой обработчик любого сигнала

такого нет?
А как оно должно "быть" (т.е. разумна ли такая вещь)?  Какие параметры должны подаваться в  AfterSignalProcessed()? Нужен как минимум код/флаг ошибки - а откуда они возьмутся если это личное дело каждого слота-обработчика ?
Записан
Kolobok
Гость
« Ответ #13 : Апрель 29, 2010, 19:51 »

1) Возможно и так(не уточнял), но только для однопотокого приложения! Улыбающийся

Цитировать
все описанные сигналы и приемники находятся в одной нити приложения

2) Очень плохой способ дублировать сединения.

А где здесь дублирование? Один сигнал посылается двум разным слотам.
Записан
spectre71
Гость
« Ответ #14 : Апрель 29, 2010, 19:59 »

А где здесь дублирование? Один сигнал посылается двум разным слотам.

Сам этот принцип - безсмысленное дублирование соединений. Второе соединение для возможной обработки ошибки.
Элементарно можно промахнуться:
- забыть сделать 2-е соединение, когда известно что в первом сединении слот может сгенерить ошибку;
- забыть добавить 2-е соединение, ко всем 1-м, во всех модулях, когда 1-й слот был изменен так что стал генерить ошибку.
- ...

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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