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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: pimpl. Почему работают сигналы из приватного класса? [РЕШЕНО]  (Прочитано 11686 раз)
ритт
Гость
« Ответ #15 : Февраль 18, 2010, 16:59 »

не переделают завтра...и в 5.0 не переделают, скорее всего...
сам часто использую данную группу макросов и пока что не собираюсь плакать

про сигналы от таймера - я даже не сразу понял суть "открытия"...но это - полная чушь Улыбающийся
то, что таймер задекларирован в приватной секции не-куобжэкта, не играет абсолютно никакой роли. ровно с таким же успехом сигналы будут испускаться и из мэйна (если создать кореапп и запустить очередь)
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #16 : Февраль 18, 2010, 18:20 »

Ок, спс за консультэйшен Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
SABROG
Гость
« Ответ #17 : Февраль 21, 2010, 01:44 »

там 90% макросов нет. и например они сами его юзают в креаторе

На самом деле код QtCreator'a оставил удручающее впечатление. Тролли вовсю используют приватные/недокументированные вещи из исходников Qt вместо того, чтобы исправить саму библиотеку и документацию сделав их публичными. Это лишь говорит о том, что сами тролли при создании QtCreator'a столкнулись с задачами, которые либо сложно либо невозможно решить публичным API Qt. Кстати запросто можно испустить сигнал любого объекта как буд-то он сам его сгенерил:

Код
C++ (Qt)
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
 
#include <QtCore/QCoreApplication>
#include <QtCore/QTimer>
#include <QtCore/QMetaMethod>
 
class Object : public QObject
{
   Q_OBJECT;
 
public:
 
   Object (QObject* parent = 0) : QObject(parent) {}
 
   virtual ~Object() {}
 
public slots:
 
   void onTimeout()
   {
       qDebug() << "Time is out. Sender: " << sender();
       qApp->quit();
   }
};
 
/* Another, more complex method
void emitSignal(QObject* obj, const char* name)
{
   QMetaObject const* mo = obj->metaObject();
   int ind = mo->indexOfMethod(QMetaObject::normalizedSignature(name));
   QMetaObject::activate(obj, ind, 0);
}
*/

 
int main(int argc, char* argv[])
{
   QCoreApplication a(argc, argv);
   Object object;
   QTimer timer;
   QObject::connect(&timer, SIGNAL(timeout()), &object, SLOT(onTimeout()), Qt::QueuedConnection);
   QMetaObject::invokeMethod(&timer, "timeout");
   //emitSignal(&timer, "timeout()"); // more complex method, doesn't support arguments for now
   return a.exec();
}
 
#include "main.moc"
 

Обратите внимание, я нигде не запускаю таймер, а он приходит как QTimer::singleShot(0, &object, SLOT(timeout()), так как был искусственно сгенерирован. На деле, если попытаться написать такое:

Код
C++ (Qt)
emit timer.timeout();
 

То Qt выдаст в консоль ошибку о том, что сигнал является protected. Но конструкция на самом деле рабочая. Задача усложняется лишь тем, что макрос "slots" помещает сигналы всегда в protected секцию и единственный способ сделать сигнал публичным это использовать Q_SIGNAL:

Код:
public:
    Q_SIGNAL void test();

Но тут может быть проблема, если в приложении используется boost или другая библиотека, которая реализует собственную систему сигналов и слотов. Если так уже нужно чтобы объект генерил сигнал, но по запросу извне, то в случае с собственным классом лучше использовать публичный метод обертку, а в случае с чужими объектами решение я привел выше.
« Последнее редактирование: Февраль 21, 2010, 01:47 от SABROG » Записан
ритт
Гость
« Ответ #18 : Февраль 21, 2010, 08:59 »

> На самом деле код QtCreator'a оставил удручающее впечатление. Тролли вовсю используют приватные/недокументированные вещи из исходников Qt вместо того, чтобы исправить саму библиотеку и документацию сделав их публичными. Это лишь говорит о том, что сами тролли при создании QtCreator'a столкнулись с задачами, которые либо сложно либо невозможно решить публичным API Qt.

будь добр, приведи несколько примеров
Записан
SABROG
Гость
« Ответ #19 : Февраль 21, 2010, 16:52 »

/src/libs/utils/consoleprocess_win.cpp

Код
C++ (Qt)
#include <QtCore/private/qwineventnotifier_p.h>
   ...
   processFinishedNotifier = new QWinEventNotifier(m_pid->hProcess, this);
   connect(processFinishedNotifier, SIGNAL(activated(HANDLE)), SLOT(stubExited()));
 

/src/libs/qtconcurrent/multitask.h

Код
C++ (Qt)
(Class::*fn)(QFutureInterface<T> &)
 

/src/plugins/qt4projectmanager/qtmodulesinfo.cpp

Код
C++ (Qt)
Q_GLOBAL_STATIC_WITH_INITIALIZER(itemVectorType, staticItemVector, {
   *x = itemVector();
});
 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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