我需要一个 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()));

关于c++ - Qt 向主应用程序窗口发送信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2495254/

10-11 23:04
查看更多