Qt 个性化标题栏,自定义标题栏
目前还没有达到自己满意的地步,魔方别人写的的,先提供参考,后面在加入新的东西
头文件
#ifndef TITLEBAR_H
#define TITLEBAR_H #include <QWidget> class QLabel;
class QPushButton; class TitleBar : public QWidget
{
Q_OBJECT
public:
explicit TitleBar(QWidget *parent = 0);
~TitleBar(); protected:
/*
* 双击标题栏进行界面最大化/还原
*/
virtual void mouseDoubleClickEvent(QMouseEvent *event);
/*
* 进行鼠标界面的拖动
*/
virtual void mousePressEvent(QMouseEvent *event);
/*
* 设置界面标题与图标
*/
virtual bool eventFilter(QObject *watched, QEvent *event); private slots:
/*
* 进行最小化、最大化/还原。关闭操作
*/
void onClicked();
private:
/*
* 最大化/还原
*/
void updateMaximize();
private:
QLabel* m_pIconLabel;
QLabel* m_pTitleLabel;
QPushButton* m_pMiniMizeButton;
QPushButton* m_pMaximizeButton;
QPushButton* m_pCloseButton;
}; #endif // TITLEBAR_H
cpp文件
#include "titlebar.h"
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QEvent>
#include <QMouseEvent>
#include <QApplication>
#include <QSizePolicy>
#include <QIcon>
#ifdef Q_OS_WIN
#pragma comment(lib,"user32.lib")
#include <qt_windows.h>
#endif TitleBar::TitleBar(QWidget *parent) : QWidget(parent)
{
/*
* 设置标题栏高度
*/
this->setFixedHeight(30);
/*
* 初始化标题栏Button及Lable
*/
m_pIconLabel = new QLabel(this);
m_pTitleLabel = new QLabel(this);
m_pMiniMizeButton = new QPushButton(this);
m_pMaximizeButton = new QPushButton(this);
m_pCloseButton = new QPushButton(this); m_pIconLabel->setFixedSize(20,20);
m_pIconLabel->setScaledContents(true); m_pTitleLabel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); m_pCloseButton->setFixedSize(27,22);
m_pMaximizeButton->setFixedSize(27,22);
m_pMiniMizeButton->setFixedSize(27,22); m_pTitleLabel->setObjectName("whiteLabel");
m_pMiniMizeButton->setObjectName("minimizeButton");
m_pMaximizeButton->setObjectName("maximizeButton");
m_pCloseButton->setObjectName("closeButton"); m_pMaximizeButton->setToolTip("Maximize");
m_pMiniMizeButton->setToolTip("Minimize");
m_pCloseButton->setToolTip("Close"); QHBoxLayout* pLayout = new QHBoxLayout(this);
pLayout->addWidget(m_pIconLabel);
pLayout->addSpacing(5);
pLayout->addWidget(m_pTitleLabel);
pLayout->addWidget(m_pMiniMizeButton);
pLayout->addWidget(m_pMaximizeButton);
pLayout->addWidget(m_pCloseButton);
pLayout->setSpacing(0); this->setLayout(pLayout); connect(m_pMiniMizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));
connect(m_pMaximizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));
connect(m_pCloseButton,SIGNAL(clicked(bool)),this,SLOT(onClicked())); } TitleBar::~TitleBar()
{ } void TitleBar::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event); emit m_pMaximizeButton->click();
} void TitleBar::mousePressEvent(QMouseEvent *event)
{
#ifdef Q_OS_WIN
if(ReleaseCapture())
{
QWidget* pWindow = this->window();
if(pWindow->isTopLevel())
{
SendMessage(HWND(pWindow->winId()),WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0);
}
}
event->ignore();
#else
#endif } bool TitleBar::eventFilter(QObject *watched, QEvent *event)
{
switch (event->type()) {
case QEvent::WindowTitleChange:
{
QWidget* pWidget = qobject_cast<QWidget*>(watched);
if(pWidget)
{
m_pTitleLabel->setText(pWidget->windowTitle());
return true;
}
}
case QEvent::WindowIconChange:
{
QWidget* pWidget = qobject_cast<QWidget*>(watched);
if(pWidget)
{
QIcon icon = pWidget->windowIcon();
m_pIconLabel->setPixmap(icon.pixmap(m_pIconLabel->size()));
return true;
}
}
case QEvent::WindowStateChange:
case QEvent::Resize:
{
updateMaximize();
return true;
}
}
return QWidget::eventFilter(watched,event);
} void TitleBar::onClicked()
{
QPushButton* pButton = qobject_cast<QPushButton*>(sender());
QWidget* pWidget = this->window();
if(pWidget->isTopLevel())
{
if(pButton == m_pMiniMizeButton)
{
pWidget->showMinimized();
}
else if(pButton == m_pMaximizeButton)
{
pWidget->isMaximized()?pWidget->showNormal():pWidget->showMaximized();
}
else if(pButton == m_pCloseButton)
{
pWidget->close();
}
} } void TitleBar::updateMaximize()
{
QWidget* pWidget = this->window();
if(pWidget->isTopLevel())
{
bool bMaximize = pWidget->isMaximized();
if(bMaximize)
{
m_pMaximizeButton->setToolTip("Restore");
m_pMaximizeButton->setProperty("maximizePorperty","restore");
}
else
{
m_pMaximizeButton->setToolTip("Maximize");
m_pMaximizeButton->setProperty("maximizePorperty","maximize");
}
m_pMaximizeButton->setStyle(QApplication::style());
}
}
使用
#include "widget.h"
#include "ui_widget.h"
#include "titlebar.h"
#include <QPalette>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //remove the title bar TitleBar* pTitleBar = new TitleBar(this);
this->installEventFilter(pTitleBar); this->resize(400,300);
this->setWindowTitle("Thunder");
// this->setWindowIcon(QIcon());
QPalette pal(palette());
pal.setColor(QPalette::Background,QColor(50,50,50));
setAutoFillBackground(true);
setPalette(pal); QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pTitleBar);
pLayout->addStretch();
pLayout->setSpacing(0);
pLayout->setContentsMargins(0,0,0,0);
this->setLayout(pLayout); } Widget::~Widget()
{
delete ui;
}
这里的效果还是有问题的,还在排错中
Qt 个性化标题栏,自定义标题栏的更多相关文章
- Qt自定义标题栏
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt自定义标题栏 本文地址:http://techieliang.com/2017/1 ...
- Qt之界面(自定义标题栏、无边框、可移动、缩放)
效果 自定义标题栏 titleBar.h #ifndef TITLEBAR_H #define TITLEBAR_H #include <QLabel> #include <QPus ...
- setFeatureInt、android 自定义标题栏
Android 自带的toolbar 往往不能很好的的满足我们的个性化要求.因此我们经常使用自定的的标题栏.而Android系统本身也允许我们自定以标题栏. 记录一下,自定义标题栏常遇到的问题.先上效 ...
- Qt::QWidget 无默认标题栏边框的拖拽修改大小方式
开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...
- UWP中实现自定义标题栏
UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...
- WPF 自定义标题栏 自定义菜单栏
自定义标题栏 自定义列表,可以直接修改WPF中的ListBox模板,也用这样类似的效果.但是ListBox是不能设置默认选中状态的. 而我们需要一些复杂的UI效果,还是直接自定义控件来的快 GitHu ...
- 【Win10开发】自定义标题栏
UWP 现在已经可以自定义标题栏了,毕竟看灰色时间长了也会厌烦,开发者们还是希望能够将自己的UI做的更加漂亮,更加与众不同.那么废话不多说,我们开始吧! 首先要了解ApplicationViewTit ...
- Android开发-取消程序标题栏或自定义标题栏
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在Android开发中,跟据需要我们有时候需要自定义应用程序的标题栏或者取消程序的标题栏,下面本菜鸟在此记录与分享一下自己使用的方法 ...
- Android应用开发基础篇(14)-----自定义标题栏
一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
随机推荐
- 使用TimeSpan对象获取时间间隔
实现效果: 关键知识: TimeSpan对象表是时间间隔或持续时间,两个DateTime对象相减,则会得到一个TimeSpan对象 使用其days ,hours,minutes等属性 实现代码: pr ...
- Javascript中==和===的区别
一.JavaScript"=="的作用 1.当==两边的内容是字符串时,则比较字符串的内容是否相等. 2.当==两边的内容是数字时,则比较数字的大小是否相等. 3.当==两边的内 ...
- 1..net转java背景介绍
注册博客2年了.从注册就开始接触.net.以前也有想过转java.只是没想过会这么快. .net语法这么优美好用.可惜了生态环境. .net还没有学成大神.就要离开了. 公司有个项目要用java.在加 ...
- JavaEE权限管理系统的搭建(七)--------管理用户的增删改
本小结讲解管理用户的增删改查实现, 首先是添加用户,如下图所示,可以看到添加用户的同时也要给用户分配角色,至少给用户分配一个或者是多个角色 页面js部分: $.ajax({ //几个参数需要注意一下 ...
- Java 基础总结
Java基础总结 jdk:Java的开发环境与部署环境jre:Java的运行环境 Java数据类型分为:基本类型和引用类型 基本类型:①整数类型 byte short int long 默 ...
- HTML页面常用的编辑框
public class FormInputUtil { /** * 获取表单中的InputText * * @param name * @param rs * @return */ public s ...
- ROUND()和TRUNC()函数
ROUND(number[,decimals]) 其中:number 待做截取处理的数值: decimals 指明需保留小数点后面的位数,可选项.需要注意的是,和trunc函数不同,对截取的数字要四舍 ...
- Webpack4 学习笔记七 跨域服务代理
webpack 小插件使用 webpack 监听文件变化配置 webpack 处理跨域问题 Webpack 小插件使用 clean-webpack-plugin: 用于在生成之前删除生成文件夹的Web ...
- C.Sum 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
题目来源:Sum 限制:1000ms 32768K Define the function S(x) for xx is a positive integer. S(x) equals to the ...
- 邮件发送失败问题:Sending the email to the following server failed : smtp.qiye.163.com:25
[邮件发送错误] : Sending the email to the following server failed : smtp.qiye.163.com:25, {}org.apache.com ...