实现思路
在 Qt 中自定义 QDialog 的标题栏可以通过隐藏系统默认标题栏并手动创建自定义标题栏实现。以下是详细步骤和代码示例:
- 隐藏系统标题栏:使用
setWindowFlags(Qt::FramelessWindowHint)隐藏系统边框和标题栏。 - 创建自定义标题栏:使用
QWidget作为容器,添加标题文字和功能按钮(最小化、最大化、关闭)。 - 实现窗口拖动:通过鼠标事件处理实现标题栏的拖拽功能。
- 添加功能按钮:为按钮绑定最小化、最大化、关闭等操作。
核心代码实现 (C++)
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QApplication>
class CustomDialog : public QDialog {
Q_OBJECT
public:
explicit CustomDialog(QWidget *parent = nullptr) : QDialog(parent) {
// 隐藏系统标题栏
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
// 创建自定义标题栏
createCustomTitleBar();
// 设置主布局
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(0, 0, 0, );
mainLayout->(titleBar);
QLabel *content = (, );
mainLayout->(content);
}
:
QWidget *titleBar;
QPushButton *minimizeButton;
QPushButton *maximizeButton;
QPushButton *closeButton;
QPoint mousePressPosition;
mousePressed;
{
titleBar = ();
QHBoxLayout *layout = (titleBar);
layout->(, , , );
QLabel *titleLabel = (, titleBar);
titleLabel->();
layout->(titleLabel);
minimizeButton = (, titleBar);
minimizeButton->(, );
(minimizeButton, &QPushButton::clicked, , &CustomDialog::showMinimized);
maximizeButton = (, titleBar);
maximizeButton->(, );
(maximizeButton, &QPushButton::clicked, []() { () ? () : (); });
closeButton = (, titleBar);
closeButton->(, );
(closeButton, &QPushButton::clicked, , &CustomDialog::close);
layout->();
layout->(minimizeButton);
layout->(maximizeButton);
layout->(closeButton);
titleBar->(
);
}
:
{
(event->() == Qt::LeftButton && titleBar->().(event->())) {
mousePressPosition = event->().();
mousePressed = ;
}
}
{
(mousePressed) {
(event->().() - mousePressPosition);
}
}
{
(event);
mousePressed = ;
}
};

