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

4
我需要一个QDialog以发送信号重新绘制主窗口。
但是connect需要连接到一个对象。
所以每次我必须使用new明确地创建每个对话框并放置一个connect()。

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

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

编辑:
谢谢 - 我不想绕过信号/插槽。我想绕过main app指针单例,例如afxGetApp()。但是我不明白如何仅发送一个信号,并将其传递到主窗口,在那里我捕获它。我想象信号/插槽就像异常。


你误解了信号/槽的工作原理。没有“捕获”未处理信号的概念,就像它们是异常一样。为什么要避免使用静态方法返回到主窗口?在这种情况下,这样做更容易,而且那就是它存在的目的... - Stu Mackellar
谢谢,那就是我错了。我以为信号比全局的getApp::redraw()更符合Qt的风格。 - user280760
@Downvoter:不要因为缺乏知识就给负评。 - Georg Fritzsche
3个回答

3

允许客户端向QCoreApplication发布CustomRedrawEvents。

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
一个简单的方法是在静态方法QApplication::topLevelWidgets()返回的所有小部件上调用repaint()。这避免了使用信号和槽的需要。

0

如果您想绕过正常的Qt用法,那么可以提供一个对主窗口的全局指针。如果我理解正确,那应该会给您所需的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接