原因是双击标题栏时会触发窗口的最大化和还原操作,而这两个操作会改变窗口的大小和位置。而单独点击放大缩小按钮只会执行放大和缩小操作,不会改变窗口的位置。
解决方法是在窗口最大化和还原操作中加入保持窗口原来位置的代码。具体实现可以通过重写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()函数,该函数根据当前窗口状态执行最大化或还原操作。