繁体   English   中英

Qt发送信号到主应用程序窗口

[英]Qt send signal to main application window

我需要一个QDialog来发送信号来重绘主窗口。
但是connect需要一个连接的对象。
所以我必须用new创建每个对话框并且每次都显式地放置一个connect()。

我真正需要的是一种从任何函数内部发送MainWindow :: Redraw()并在Mainwindow中有一个connect()来接收它们的方法。

但你不能使信号静态,对话框显然不会从MainWindow继承。

编辑:
谢谢 - 我不想绕过信号/插槽。 我想绕过主应用程序指针单例,如afxGetApp()。 但是我不明白如何发出一个信号并将它汇集(或向下?)到我看到的主窗口。 我把信号/插槽描绘成异常

让客户将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()));

一个简单的方法是简单地在静态方法QApplication :: topLevelWidgets()返回的所有小部件上调用repaint()。 这避免了使用信号和插槽的需要。

如果您希望支持正常的Qt惯用法,那么您可以提供指向主窗口的全局指针。 如果我理解正确的话,那应该为您提供所需的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM