【发布时间】:2021-10-21 01:46:09
【问题描述】:
我正在尝试在 Qt 中创建一个自定义窗口框架,但我无法让标题栏按照我想要的方式运行。所以我想要的是标题在标题栏中居中,最小化、最大化和 X 按钮位于标题上方的图层上。 (我也在考虑在左侧添加一个汉堡图标,该图标将位于打开侧面板的同一层上。)但我想要的是这种行为:
这里:
所以这篇文章对我帮助很大 (How To implementing multi layer frame or widget in Qt?)。但是,他们使用 Python,而我使用的是 C++。不过,我认为我理解它背后的概念。我的布局如下所示:这里:
。我正在添加一个包含两个子项的自定义标题栏小部件:一个 qlabel(标题)和一个包含所有三个按钮的 QFrame 小部件。
这是我目前所拥有的
windowframe_btns.cpp:
#include "windowframe_btns.h"
Windowframe_btns::Windowframe_btns(QFrame *parent) : QFrame(parent)
{
setStyleSheet("QPushButton{"
"border: none;"
"background: none;"
"}"
"QPushButton:hover{"
"background: rgba(0, 0, 0, 20);"
"}");
btn_close->setStyleSheet(":hover{"
"background: rgb(230, 93, 66);}");
layout->setContentsMargins(0,0,0,0);
layout->setSpacing(0);
setLayout(layout);
btn_maximize->setIcon(QIcon(QPixmap(":/icons/full_screen.png")));
btn_minimize->setIcon(QIcon(QPixmap(":/icons/minimize.png")));
btn_close->setIcon(QIcon(QPixmap(":/icons/close.png")));
layout->addWidget(btn_minimize);
layout->addWidget(btn_maximize);
layout->addWidget(btn_close);
}
标题栏.cpp:
#include "titlebar.h"
#include <QLabel>
#include <QVBoxLayout>
#include <QGridLayout>
TitleBar::TitleBar(QWidget *parent) : QWidget(parent)
{
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
title->setPixmap(QPixmap(":/icons/test_logo.png"));
title->setGeometry(430,0,40,40);
title->setAlignment(Qt::AlignCenter);
title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
title -> setScaledContents(true);
title->setParent(this);
btns->setParent(this);
btns->move(800,0);
}
所以你可以看到现在我手动放置了所有东西。每当我尝试使用标题栏小部件尺寸来做我想做的事情时,它似乎并没有填满我放入的框架,因为我没有布局,但是如果我添加布局,那么我就不能分层就像我想要的那样。
这是我运行时得到的: window
【问题讨论】:
标签: c++ qt window-resize