QT开发中文网

Qt双击自定义标题栏最小化时窗口移动到屏幕左上角,单独点击放大缩小按钮却不会出现这种情况,原因是什么,该怎么解决?请给出示例

原因是双击标题栏时会触发窗口的最大化和还原操作,而这两个操作会改变窗口的大小和位置。而单独点击放大缩小按钮只会执行放大和缩小操作,不会改变窗口的位置。

解决方法是在窗口最大化和还原操作中加入保持窗口原来位置的代码。具体实现可以通过重写QWidget的resizeEvent()函数,在窗口最大化和还原时判断窗口状态,如果是从最大化还原,则将窗口移动回原来位置。

下面是一个示例代码:

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QPushButton>

class MyWidget : public QWidget {
public:
    MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
        setWindowFlags(Qt::FramelessWindowHint);

        QHBoxLayout* layout = new QHBoxLayout(this);
        QPushButton* minBtn = new QPushButton("Minimize", this);
        QPushButton* maxBtn = new QPushButton("Maximize", this);
        QPushButton* restoreBtn = new QPushButton("Restore", this);
        layout->addWidget(minBtn);
        layout->addWidget(maxBtn);
        layout->addWidget(restoreBtn);

        connect(minBtn, &QPushButton::clicked, this, &QWidget::showMinimized);
        connect(maxBtn, &QPushButton::clicked, this, &MyWidget::maximize);
        connect(restoreBtn, &QPushButton::clicked, this, &QWidget::showNormal);
    }

protected:
    void resizeEvent(QResizeEvent* event) override {
        if (isMaximized() && !m_isMaximized) {
            m_isMaximized = true;
            m_restorePos = pos();
            m_restoreSize = size();
            move(0, 0);
            resize(QApplication::desktop()->availableGeometry().size());
        } else if (!isMaximized() && m_isMaximized) {
            m_isMaximized = false;
            move(m_restorePos);
            resize(m_restoreSize);
        }
    }

private:
    bool m_isMaximized = false;
    QPoint m_restorePos;
    QSize m_restoreSize;

    void maximize() {
        if (isMaximized()) {
            showNormal();
        } else {
            showMaximized();
        }
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWidget widget;
    widget.resize(400, 300);
    widget.show();
    return app.exec();
}

在这个示例中,我们创建了一个自定义的窗口,并添加了三个按钮:最小化、放大和还原。在resizeEvent()函数中,我们判断了窗口是否从最大化还原,如果是,则记录下窗口原来的位置和大小,并在最大化时将窗口移动到左上角。当窗口从最大化还原时,我们将窗口移动回原来的位置并恢复窗口的大小。在放大和还原按钮的点击事件中,我们调用了自定义的maximize()函数,该函数根据当前窗口状态执行最大化或还原操作。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=715

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?