美文网首页
重写Qt源码中的对话框

重写Qt源码中的对话框

作者: 豪爵吸金ing | 来源:发表于2024-09-27 17:46 被阅读0次

项目中遇到了需要重写Qt源码中的对话框


qt库源码

static void displayRenameFailedMessage(const QString &newName) 这个实现在源码里,
想重写修改QMessageBox的展示。

上代码

void setupMessageBoxEventFilter(QApplication &app) {

    WindowManager *windowManager = new WindowManager();
    auto eventFilter = new MessageBoxEventFilter();
    app.installEventFilter(eventFilter);

    QObject::connect(eventFilter, &MessageBoxEventFilter::sigCloseWidget,
                     windowManager, &WindowManager::closeWidget,Qt::QueuedConnection);
}
class WindowManager : public QObject {
    Q_OBJECT

public slots:
    void closeWidget(QWidget *widget) {
        if (widget) {
            widget->close();  // 关闭接收到的窗口
        }
    }
};
class MessageBoxEventFilter : public QObject {
    Q_OBJECT

signals:
    void sigCloseWidget(QWidget *widget);
protected:
    bool eventFilter(QObject *obj, QEvent *event) override {
        if (AndyMessageBox *msgBox = qobject_cast<AndyMessageBox*>(obj)){
            return QObject::eventFilter(obj, event);
        }
        if (QMessageBox *msgBox = qobject_cast<QMessageBox*>(obj)) {
            qDebug()<<msgBox->objectName()<< " event type is "<< event->type();
            //
            switch (event->type()) {
            case QEvent::Show:
            {
                msgBox->setWindowOpacity(0);
                AndyMessageBox *customDialog = new AndyMessageBox(msgBox->parentWidget());
                customDialog->setObjectName("shixingya" );
                customDialog->setWindowTitle("andy -- "+ msgBox->windowTitle());
                customDialog->setText(msgBox->text());
                customDialog->resize(1800,500);
                customDialog->exec();

                emit sigCloseWidget(msgBox);  // 发出关闭信号
            }
            break;
            default:
                break;
            }
        }
        return QObject::eventFilter(obj, event);
    }
};

相关文章

网友评论

      本文标题:重写Qt源码中的对话框

      本文链接:https://www.haomeiwen.com/subject/ytxlrjtx.html