Qt软件开发文档6---dockWidget自定义标题栏

Qt 自带的 QDockWidget 的标题栏只有两个按钮, 浮动按钮和 关闭按钮。
往往满足不了需求,只适合需要我们自定义一个标题栏。
如下 标题栏实现了自定义的最小化,最大化,关闭按钮 ,接收到dock传来的标题信息
这里写图片描述
这里写图片描述
直接上代码:
1.声明一个MyDockTitleBar类
MyDockTitleBar.h

#ifndef MYDOCKTITLEBAR_H
#define MYDOCKTITLEBAR_H

#include <QSize>
#include <QDockWidget>
#include <QMouseEvent>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QStyle>

class MyDockTitleBar : public QWidget
{
    Q_OBJECT
public:
    MyDockTitleBar(QString dockName,QWidget *parent = 0);

    QSize sizeHint() const { return minimumSizeHint(); }
    QSize minimumSizeHint() const;

    int width;
    QString name;//receive parent,s name
protected:
    void paintEvent(QPaintEvent *event);//paint titleBar
    void mousePressEvent(QMouseEvent *event); //mouse press

private:
    QPixmap minPix, closePix, floatPix;

};

#endif // MYDOCKTITLEBAR_H

MyDockTitleBar.cpp

#include "myDockTitleBar.h"
MyDockTitleBar::MyDockTitleBar(QString dockName,QWidget *parent)
: QWidget(parent)
{
    //pixMap
    minPix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);
    closePix  = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
    floatPix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);
    name = dockName;
}

//set TitleBar minimumSize
QSize MyDockTitleBar::minimumSizeHint() const
{
    return QSize(156, 24);
}

//绘制titleBar
void MyDockTitleBar::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QRect rect = this->rect();
    width = rect.width();
    //drawPixmap
    painter.setPen(QPen(QColor(185, 185, 185), 2, Qt::SolidLine));
    painter.setBrush(QBrush(QColor(218, 218, 218), Qt::SolidPattern));
    painter.drawRect(rect.left(), rect.top(), rect.width(), rect.height());
    painter.drawPixmap(rect.topRight() - QPoint(closePix.width() + 10, -6), closePix);
    painter.drawPixmap(rect.topRight() - QPoint(floatPix.width() + 10 + closePix.width() + 10, -6), floatPix);
    painter.drawPixmap(rect.topRight() - QPoint(floatPix.width() + 10 + minPix.width() + 10
                                                + closePix.width() + 10, -3), minPix);
    //drawText
    painter.setPen(QPen(Qt::black, 1, Qt::SolidLine));
    painter.setBrush(Qt::NoBrush);
    painter.drawText(rect.left() + 10, rect.top()-2, rect.width(), rect.height(), Qt::AlignVCenter, name);

    //draw   Blank area
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(240, 240, 240), Qt::SolidPattern));//设置画刷形式
    painter.drawRect(rect.left(), rect.top() + 19, rect.width(), 5);

}

void MyDockTitleBar::mousePressEvent(QMouseEvent *event)
{
    QPoint pos = event->pos();

    QRect rect = this->rect();

    QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
    Q_ASSERT(dw != 0);

    //in this case,pix width = 10,pix spacing = 10
    int right = rect.right() - pos.x();
    QWidget *widget = dw->widget();
    if (right >= 10 && right <= 20)
    {
        event->accept();
        dw->close();
    }
    else if (right >= 30 && right <= 40){
        event->accept();
        if (widget->isVisible()){

        }
        else {
            widget->show();
            //dw setMinimumWidth initialize
            dw->setMinimumWidth(156);
        }
    }
    else if (right >= 50 && right <= 60){
        event->accept();
        if (widget->isVisible()){
            //click minPix ,dw setMinimumWidth
            dw->setMinimumWidth(width);
            widget->hide();
        }
        else {

        }
    }
}

在窗口中调用

    dock[0] = new QDockWidget(tr("TreeView"),this);
    dock[0]->setFeatures(QDockWidget::AllDockWidgetFeatures);//所有属性
    dock[0]->setAllowedAreas(Qt::LeftDockWidgetArea);//设置允许停靠的窗口位置
    dllName = "treeDll.dll";
    funcName = "showTree";
    MyDockTitleBar *titleBar0 = new MyDockTitleBar(tr("TreeView"), dock[0]);
    dock[0]->setTitleBarWidget(titleBar0);
    QWidget *tree = new QWidget(dock[0]);
    tree = setWidget(dllName,funcName);
    tree->setMinimumHeight(130);
    dock[0]->setWidget(tree);
    addDockWidget(Qt::LeftDockWidgetArea,dock[0]);

本文借鉴:https://www.oschina.net/code/snippet_1029551_20242

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值