【问题标题】:Resizing Behavior for Custom Title Bar调整自定义标题栏的大小行为
【发布时间】: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


    【解决方案1】:

    更新给任何发现这个的人,我认为将大小/几何设置为小部件的父级至少会导致它在程序启动时填充小部件。在覆盖的调整大小事件函数中定义相同会导致正确的行为。我在处理另一个小部件时发现了这一点。我误解了 resize 事件的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多