自定义标题栏

(ui中的样式表是最基础的,不会被父组件或者外部类中的样式表覆盖,只有在ui所在cpp中使用setstylesheet这个控件能覆盖。和类的实例也就是样式表应用时机有关,先调用父组件的样式表,后被new ui中的样式表代替,最后再被类中的样式表代替)

普通的ui可以,在ui顶部加一个容器,作为标题栏。自身的标题栏隐藏

假如dialog这个ui中已经有布局了,那么需要在外部另外创建一个标题栏ui,然后组装

class CT_CORE_EXPORT TitleBar : public QFrame
{
    Q_OBJECT

public:
    explicit TitleBar(QString titleName, QWidget *parent = nullptr);
    ~TitleBar();

    static void swapTitleBar(QString titleName, QWidget* wid);

protected:
    void mousePressEvent(QMouseEvent *event) override;

    void mouseMoveEvent(QMouseEvent *event) override;

private:
    Ui::TitleBar *ui;

    QPoint dragPosition;
};
TitleBar::TitleBar(QString titleName, QWidget *parent) :
    QFrame(parent),
    ui(new Ui::TitleBar)
{
    ui->setupUi(this);

    setFixedHeight(30);
    ui->label_title->setText(titleName);
    connect(ui->pushButton, &QPushButton::clicked, parent, &QWidget::close);
}

TitleBar::~TitleBar()
{
    delete ui;
}

void TitleBar::swapTitleBar(QString titleName, QWidget *wid) {
    // 去除系统标题栏
    wid->setWindowFlags(Qt::FramelessWindowHint);
    wid->setAttribute(Qt::WA_TranslucentBackground);

    // 获取 Designer 的主布局(假设是 verticalLayout)
    QBoxLayout *originalLayout = qobject_cast<QBoxLayout *>(wid->layout());
    if (!originalLayout) {
        originalLayout = new QVBoxLayout(wid);
        wid->setLayout(originalLayout);
    }

    // 插入自定义标题栏到顶部
    TitleBar *titleBar = new TitleBar(titleName, wid);
    originalLayout->setSpacing(0);
    originalLayout->insertWidget(0, titleBar);
}

void TitleBar::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        dragPosition = event->globalPos() - parentWidget()->pos();
        event->accept();
    }
}

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

假如是mainwindow类型的ui需要重新设计标题栏,有两种方式,一是重新设计layout并且插入menu/tool/center等,二是直接使用原来的menubar作为标题栏,toolbar作为菜单栏

setmenuwidget()
ui->toolBar->addWidget();
Table of Contents