位置: 首页 > 个人笔记 > QT实现无边框自定义标题栏丝滑拖拽功能示例代码

QT实现无边框自定义标题栏丝滑拖拽功能示例代码

  • 阅读: 489
  • 发布时间: 2023-08-31 19:51:42
  • 评论: 9999+

以下是一个完整的示例代码,演示了在 Qt 中实现无边框窗口、自定义标题栏以及最大化和最小化功能:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QMouseEvent>

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

// 创建自定义标题栏部件
QLabel *titleLabel = new QLabel("Custom Title");
QPushButton *minimizeButton = new QPushButton("-");
QPushButton *maximizeButton = new QPushButton("□");
QPushButton *closeButton = new QPushButton("✕");

// 设置标题栏部件样式
titleLabel->setObjectName("TitleLabel");
minimizeButton->setObjectName("TitleButton");
maximizeButton->setObjectName("TitleButton");
closeButton->setObjectName("TitleButton");

// 创建水平布局
QHBoxLayout *titleLayout = new QHBoxLayout;
titleLayout->addWidget(titleLabel);
titleLayout->addWidget(minimizeButton);
titleLayout->addWidget(maximizeButton);
titleLayout->addWidget(closeButton);

// 创建主布局
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addLayout(titleLayout);
mainLayout->addWidget(new QLabel("Hello, World!"));

// 设置窗口样式
setStyleSheet("QWidget { background-color: white; }"
"QLabel#TitleLabel { font-size: 16px; font-weight: bold; }"
"QPushButton#TitleButton { min-width: 30px; min-height: 30px; }");

// 连接按钮的点击事件
connect(minimizeButton, &QPushButton::clicked, this, &CustomWindow::onMinimizeButtonClicked);
connect(maximizeButton, &QPushButton::clicked, this, &CustomWindow::onMaximizeButtonClicked);
connect(closeButton, &QPushButton::clicked, this, &CustomWindow::close);
}

protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
m_dragPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}

void mouseMoveEvent(QMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton)
{
move(event->globalPos() - m_dragPos);
event->accept();
}
}

private slots:
void onMinimizeButtonClicked()
{
showMinimized();
}

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

private:
QPoint m_dragPos;
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

CustomWindow window;
window.show();

return a.exec();
}

在上述代码中,我们创建了一个自定义的窗口类 CustomWindow,继承自 QWidget。在构造函数中,设置了窗口的属性为 Qt::FramelessWindowHint,去除了标题栏和边框。然后,我们创建了自定义的标题栏部件,并使用水平布局来容纳标题栏的部件。在标题栏的按钮点击事件中,调用相应的窗口函数来实现最大化和最小化功能。最后,我们在 main 函数中创建了一个 CustomWindow 的实例,并显示出来。

注意,在这个示例中,只包含了最基本的实现,你可以根据自己的需求进一步完善代码,例如添加窗口的拖动边界限制、窗口阴影效果等。同时,你也可以根据自己的需要对标题栏的外观进行样式调整

发布评论 留下您的评论 给个鼓励吧

搜索

用户推荐

sq1995liu
TA很懒,还没有添加简介
hxm8888
TA很懒,还没有添加简介
haru88
TA很懒,还没有添加简介
287801813
TA很懒,还没有添加简介
ffshen
TA很懒,还没有添加简介
renhuanxi
TA很懒,还没有添加简介
erpao123
TA很懒,还没有添加简介
aa99605
TA很懒,还没有添加简介
summber
TA很懒,还没有添加简介
A7777
TA很懒,还没有添加简介