自定义标题栏
(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();