qt在不隐藏原生标题栏的情况下修改原生标题栏从而实现自定义标题栏
时间: 2023-12-26 09:46:26 浏览: 46
Qt的QWidget类提供了一个函数setWindowTitle()可以修改窗口的标题栏。如果你想要自定义标题栏,可以在QWidget的子类中实现以下步骤:
1. 在构造函数中设置窗口的样式为Qt::CustomizeWindowHint,这样可以禁用原生标题栏。
2. 创建一个QWidget对象作为自定义标题栏,并将它添加到QWidget子类的布局中。
3. 为自定义标题栏添加控件和布局,并实现鼠标事件以实现移动和拖动窗口。
4. 在鼠标事件处理函数中调用QWidget的move()函数以实现窗口移动。
示例代码如下:
```cpp
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
// 禁用原生标题栏
setWindowFlags(Qt::CustomizeWindowHint);
// 创建自定义标题栏
m_titleBar = new QWidget(this);
m_titleBar->setFixedHeight(30);
m_titleBar->setObjectName("TitleBar"); // 设置样式表用到的对象名
// 添加控件和布局
m_layout = new QHBoxLayout(m_titleBar);
m_layout->setContentsMargins(0, 0, 0, 0);
m_layout->addWidget(new QLabel("My Title"));
// 设置样式表
setStyleSheet("#TitleBar{background-color: #333333; color: #ffffff;}");
// 添加自定义标题栏到布局中
m_mainLayout = new QVBoxLayout(this);
m_mainLayout->addWidget(m_titleBar);
m_mainLayout->addWidget(new QLabel("My Content"));
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
// 记录鼠标按下时的位置
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
}
void mouseMoveEvent(QMouseEvent *event) override
{
// 移动窗口
if (event->buttons() & Qt::LeftButton) {
move(event->globalPos() - m_dragPosition);
}
}
private:
QWidget *m_titleBar;
QHBoxLayout *m_layout;
QVBoxLayout *m_mainLayout;
QPoint m_dragPosition;
};
```
这样,你就可以在不隐藏原生标题栏的情况下实现自定义标题栏了。