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 ...
随机推荐
- [转]这13个开源GIS软件,你了解几个?
这些开源GIS软件,你了解几个?本文内容部分来源于一份罗列了关于GIS软件应用的文章,笔者将其编译整合. 地理信息系统(Geographic Information System,GIS)软件依赖于覆 ...
- visual assist x vs2012不智能提示
今天装了visual assist x,但是在vs2012里不智能提示,在哪里看了看.找到了开关. 我英文不好.... 默认的话是不选中的.
- Entity Framework5.0运行时错误ObjectStateManager 中已存在具有同一键的对象
EF写了个简单的框架,在把查询出来的数据修改回去时,报了ObjectStateManager 中已存在具有同一键的对象这样一个错误,寻寻觅觅终于找到了最终的解决方案. ObjectStateManag ...
- LeetCode7.整数反转 JavaScript
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...
- Struts2 第五讲 -- Struts2与Servlet的API解耦
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext ...
- 两台电脑在不同情况下ping的情况
两台计算机(交叉连接) 同一网段 ,可以ping通.不同网段,不可以 两台计算机通过一台交换机连接 同一网段 ,可以ping通.不同网段,不可以.同一网段,同一Vlan,不可以. 综上:跨网段通信,必 ...
- Hibernate知识点小结汇总
Hibernate部分 1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复 ...
- logback.xml模板详解
<?xml version="1.0" encoding="UTF-8"?> <!-- 配置文件每隔1分钟,就检查更新 --> < ...
- C++练习--实现客户机(CLIENT)类
实现客户机(CLIENT)类. 定义字符型静态数据成员SeverName,保存其服务器名称: 整型静态数据成员ClientNum,记录已定义的客户数量: 定义静态函数ChangeSeverName() ...
- 构建高可靠hadoop集群之1-理解hdfs架构
本文主要参考 http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html 主要内容是对该文 ...