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