Qt отправить сигнал в главное окно приложения - PullRequest
4 голосов
/ 22 марта 2010

Мне нужен QDialog для отправки сигнала, чтобы перерисовать главное окно.
Но для подключения требуется объект, к которому нужно подключиться.
Поэтому я должен создавать каждый диалог с новым и явно ставить connect () каждый раз.

Что мне действительно нужно, так это способ отправки MainWindow :: Redraw () изнутри любой функции и наличие единственного connect () внутри Mainwindow для их получения.

Но вы не можете сделать сигнал статичным, и диалоги явно не наследуются от MainWindow.

редактирование:
Спасибо - я не хочу обходить сигнал / слоты. Я хочу обойтись без единого указателя основного приложения, такого как afxGetApp (). Но я не понимаю, как просто посылать сигнал и направлять его вверх (или вниз?) В главное окно, где я его ловлю. Я изображал сигналы / слоты как исключения

Ответы [ 3 ]

3 голосов
/ 23 марта 2010

Разрешить клиентам публиковать CustomRedrawEvents в QCoreApplication.

class CustomRedrawEvent : public QEvent
{
public:
    static Type registeredEventType() { 
        static Type myType 
            = static_cast<QEvent::Type>(QEvent::registerEventType());
        return myType;
    }    

    CustomRedrawEvent() : QEvent(registeredEventType()) {
    }
};

void redrawEvent() {
    QCoreApplication::postEvent(
        QCoreApplication::instance(), 
        new CustomRedrawEvent());
}

Установите событие в экземпляре CoreApplication и подключитесь к сигналу перерисовки:

class CustomRedrawEventFilter : public QObject
{
    Q_OBJECT
public:
    CustomRedrawEventFilter(QObject *const parent) : QObject(parent) {
    }

signals:
    void redraw();

protected:
    bool eventFilter(QObject *obj, QEvent *event) {
        if( event && (event->type()==CustomRedrawEvent::registeredEventType())) {
            emit redraw();
            return true;
        } 
        return QObject::eventFilter(obj, event);
    }
};

//main()
QMainWindow mainWindow;
QCoreApplication *const coreApp = QCoreApplication::instance();
CustomRedrawEventFilter *const eventFilter(new CustomRedrawEventFilter(coreApp));
coreApp->installEventFilter(eventFilter);
mainWindow.connect(eventFilter, SIGNAL(redraw()), SLOT(update()));
1 голос
/ 22 марта 2010

Простой способ сделать это - просто вызвать repaint () для всех виджетов, возвращаемых статическим методом QApplication :: topLevelWidgets (). Это исключает необходимость использования сигналов и слотов.

0 голосов
/ 22 марта 2010

Если вы хотите обойти обычную идиому Qt, то можете предоставить глобальный указатель на главное окно. Это должно дать вам необходимую функциональность, если я вас правильно понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...