当前位置: 首页 > 工具软件 > TitleBar > 使用案例 >

QT QDockWidget titleBar重绘

芮化
2023-12-01

为了修改样式,便于后续皮肤的更换,重绘了QDockWidget 的titleBar
totalTitleBar.h

#ifndef TOTALTITLEBAR_H
#define TOTALTITLEBAR_H

#include <QSize>
#include <QDockWidget>
#include <QMouseEvent>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include "qdebug.h"
#include <QStyle>



class TotalTitleBar : public
	QWidget
{
	Q_OBJECT
public:
	TotalTitleBar(QWidget *parent = 0);
	QColor backgroudColor = QColor(67, 67, 67, 100); // 标题栏默认背景颜色
	int fontSize = 10; // 默认标题栏文本字号
	QString titleBarText = ""; // 默认标题栏文本
	QColor fontColor = QColor(220, 220, 220);  // 默认标题栏文本颜色
	void setAttr(QColor _backgroudColor, int _fontSize, QString _titleBarText, QColor _fontColor);
	QSize sizeHint() const
	{
		return
			minimumSizeHint();
	}

	QSize minimumSizeHint() const;

protected:
	void paintEvent(QPaintEvent *event);
	void mousePressEvent(QMouseEvent *event);

	public slots:
	void updateMask();

private:
	QPixmap minPix, closePix, floatPix;

};





#endif // TOTALTITLEBAR_H

totalTitleBar…cpp

#include "totalTitleBar.h"

TotalTitleBar::TotalTitleBar(QWidget *parent)
	: QWidget(parent)

{
	//minPix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);
	//closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
	//floatPix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);

}



QSize TotalTitleBar::minimumSizeHint() const

{
	QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());

	Q_ASSERT(dw != 0);

	QSize result(100, 30);

	if
		(dw->features() & QDockWidget::DockWidgetVerticalTitleBar)
		result.transpose();

	return
		result;

}

void TotalTitleBar::paintEvent(QPaintEvent*)

{
	QPainter painter(this);
	QRect rect = this->rect();
	QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
	Q_ASSERT(dw != 0);

	if
		(dw->features() & QDockWidget::DockWidgetVerticalTitleBar) {
		QSize s = rect.size();
		s.transpose();
		rect.setSize(s);

		painter.translate(rect.left(), rect.top() + rect.width());
		painter.rotate(-90);
		painter.translate(-rect.left(), -rect.top());

	}
	painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), backgroudColor); //QColor(67, 67, 67, 100)
	painter.drawPixmap(rect.topRight() - QPoint(closePix.width() + 10, -10), closePix);
	painter.drawPixmap(rect.topRight() - QPoint(minPix.width() + 10 + closePix.width() + 10, -7), minPix);
	painter.drawPixmap(rect.topRight() - QPoint(floatPix.width() + 10 + minPix.width() + 10 + closePix.width() + 10, -10), floatPix);

	QFont font1("微软雅黑", fontSize, false, false); //fontSize 10
	painter.setFont(font1);
	painter.setPen(fontColor); // fontColor QColor(220, 220, 220)
	painter.drawText(rect.left() + 5, 20, titleBarText); // titleBarText QStringLiteral("动画")
}

void TotalTitleBar::mousePressEvent(QMouseEvent *event)

{

	QPoint pos = event->pos();
	QRect rect = this->rect();
	QDockWidget *dw = qobject_cast<QDockWidget*>(parentWidget());
	Q_ASSERT(dw != 0);
	if
		(dw->features() & QDockWidget::DockWidgetVerticalTitleBar) {

		QPoint p = pos;
		pos.setX(rect.left() + rect.bottom() - p.y());
		pos.setY(rect.top() + p.x() - rect.left());



		QSize s = rect.size();
		s.transpose();
		rect.setSize(s);

	}
	const int buttonRight = 10;
	const int buttonWidth = 20;
	int right = rect.right() - pos.x();
	int button = (right - buttonRight) / buttonWidth;

	qDebug() << rect.right() << " --- " << pos.x() << " --- " << right << " --- " << button;

	switch
		(button) {

	case 0:
		event->accept();
		dw->hide();
		break;

	case 1:
		event->accept();
		dw->setFloating(!dw->isFloating());
		break;

	case 2: {
		event->accept();
		QDockWidget::DockWidgetFeatures features = dw->features();
		if
			(features & QDockWidget::DockWidgetVerticalTitleBar)
			features &= ~QDockWidget::DockWidgetVerticalTitleBar;
		else
			features |= QDockWidget::DockWidgetVerticalTitleBar;

		dw->setFeatures(features);
		break;

	}
	default:
		event->ignore();
		break;

	}

}

void TotalTitleBar::setAttr(QColor _backgroudColor = QColor(67, 67, 67, 100), int _fontSize = 10, QString _titleBarText = QStringLiteral(""), QColor _fontColor = QColor(220, 220, 220))
{
	backgroudColor = _backgroudColor;
	fontSize = _fontSize; // 默认标题栏文本字号
	titleBarText = _titleBarText; // 默认标题栏文本
	fontColor = _fontColor;  // 默认标题栏文本颜色
	update();
}

void TotalTitleBar::updateMask()
{
}

使用方法可直接new,使用默认值,或者new后调用setAttr来update()重绘

 类似资料: