自定义窗口及拖动

1.自定义无边框窗口时,需要将窗口标志设为:

Qt::FramelessWindowHint |Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint

2.然后还需要通过安装EventFilter给自己监视窗口拖动

其中构造函数实现:

myUi::myUi(QWidget *parent) :
QWidget(parent)
{ setWindowFlags(Qt::FramelessWindowHint |Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
qApp->installEventFilter(this); //给自己加事件过滤器,用来实现拖动窗口
... ...
}

eventFilter事件处理函数实现:

bool myUi::eventFilter(QObject *obj, QEvent *evt)
{
QMouseEvent *mouse = dynamic_cast<QMouseEvent *>(evt);
if(obj == this&&mouse) //判断拖动
{
if(this->isMaximized())
{
return true;
}
static bool dragFlag = false;
static QPoint dragPoint(,);
if(mouse->button()==Qt::LeftButton && mouse->type() ==QEvent::MouseButtonPress) //按下
{
dragFlag =true;
dragPoint = mouse->pos(); //记录鼠标所在的界面位置
return true;
}
else if(dragFlag && mouse->type() ==QEvent::MouseMove) //拖动
{
this->move(mouse->globalPos() - dragPoint);
return true;
}
else if(mouse->type() ==QEvent::MouseButtonRelease)
{
dragFlag = false;
return true;
}
} return QWidget::eventFilter(obj,evt);
}

自定义QToolButton/QPushButton开关按钮

1.以QToolButton为例,构造函数里实现:

myUi::myUi(QWidget *parent) :
QWidget(parent)
{
//... ...
ui->ToolButton->setText("更新设置");
ui->ToolButton->setIcon( QIcon(":/image/ok.png"));
connect(ui->ToolButton ,SIGNAL(clicked()),this,SLOT(onPageStartBtnClicked()));
ui->ToolButton->setProperty("START","Up"); //设置为未按下状态
//... ...
}

2.槽函数里实现:

void myUi::onPageStartBtnClicked()
{
if(b->property("START")=="Up") //之前是未按下
{
ui->ToolButton->setProperty("START","Down"); //设置为按下
ui->ToolButton->setText("取消设置");
ui->ToolButton->setIcon( QIcon(":/image/colose.png"));
//... ...
}
else
{
ui->ToolButton->setProperty("START","Up"); //设置为未按下状态
ui->ToolButton->setText("更新设置");
ui->ToolButton->setIcon( QIcon(":/image/ok.png"));
//... ...
}
}

3.QSS代码:

/*正常状态下*/
QToolButton[START="Up"] {
border-radius: 20px;
border: none;
padding-left :30px;
color: rgb(255,255,255);
background: rgb(56,167,222);
} QToolButton[START="Up"]:hover { padding-bottom: 2px;
background: rgb(0,205,252);
} QToolButton[START="Up"]:checked,QToolButton[START="Up"]:pressed {
background: rgb(6,144,175);
} /*取消状态下*/
QToolButton[START="Down"] {
border-radius: 20px;
border: none;
    padding-left :30px;
     color: rgb(255,255,255);
     background: qlineargradient(spread:pad,
x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255,176,30, 255),
stop:0.6 rgba(254,139,91, 255),
stop:1.0 rgba(254,176,143, 255));
} QToolButton[START="Down"]:hover {
padding-bottom: 2px;
background: qlineargradient(spread:pad,
x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255,176,30, 255),
stop:0.6 rgba(255,74,0, 255),
stop:1.0 rgba(255,183,153, 255));
}

效果

点击前:

点击后:

界面阴影

首先,将界面拖放在QFrame子组件里,然后将该QFrame居中,与主窗口间隔10px左右(用来显示阴影).并将主窗口设为透明属性.

接下来,有2种方法设置阴影:

1.使用QGraphicsDropShadowEffect图像阴影效果类

好处在于快捷,只需要在构造函数里实现即可,坏处就是界面有点卡(我这里测试是这样的)

QGraphicsDropShadowEffect常用函数:

setOffset ( qreal dx, qreal dy );
//设置阴影的偏移度,如果想实现整个界面上下左右都有阴影,则设为dx=0,dy=0.
//当dx为负时,表示偏移为左,反之为右
//当dy为负时,表示偏移为上,反之为下 void setBlurRadius ( qreal blurRadius );
//设置阴影半径,值越大,则阴影效果越强 setColor ( const QColor & color )
//设置阴影颜色

示例-在构造函数里调用:

   setAttribute(Qt::WA_TranslucentBackground);

   QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);

   shadowEffect->setOffset(,);

   shadowEffect->setColor(QColor(,,));

   shadowEffect->setBlurRadius();

   ui->frame->setGraphicsEffect(shadowEffect);

效果:

2.QPainter绘画

首先,在构造函数里调用下面函数,设置透明:

setAttribute(Qt::WA_TranslucentBackground);

然后在paintEvent函数里进行绘制

void myUi::paintEvent(QPaintEvent *)  //绘画阴影
{
int size =; //阴影宽度
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); QColor color(, , , );
for(int i=;i<=size; i++)
{
color.setAlpha(i*);
painter.setPen(color);
painter.setBrush(Qt::transparent);
painter.drawRoundedRect(i,i,this->width()-i*, this->height()-i*,,);
}
}

由于界面是圆角的,所以通过drawRoundedRect()绘制.

效果:

参考: https://blog.csdn.net/stephan14/article/details/47406881

参考: http://blog.sina.com.cn/s/blog_a6fb6cc90101eoop.html#cmt_53197A33-7F000001-6E85F70F-8B8-8A0

但是如果在低于qt 5.1.1版本时,设置QT::FramelessWindowHint和Qt::WA_TranslucentBackground时会出现一个bug:

在最小化还原时界面停止刷新

参考:https://blog.csdn.net/yiqiyihuiligang/article/details/51438600

播放声音

当弹出对话框时,需要播放声音,可以使用windows自带的声音,位置在C:\Windows\Media里

QSound播放的只有.wav文件,并且比特率不能太高,可以使用格式工厂,把比特率降到三百多

并且声音路径必须是在APP程序的路径,示例:

    QString dir=QCoreApplication ::applicationDirPath();
QString filename(dir+"/sound/ok.wav"); //等价于:"./sound/ok.wav"
qDebug()<<dir;//打印APP路径
QSound::play ( filename );

参考:https://blog.csdn.net/qq_28364283/article/details/50907329

 隐藏任务栏

setWindowFlags(Qt::FramelessWindowHint|Qt::Tool);

setAttribute(Qt::WA_TranslucentBackground);

为什么要隐藏任务栏

比如当我们拖动无边框界面时,需要绘制界面边框线,如果不隐藏的话,就会出现两个任务栏图标

 


 

29.QT-自定义窗口拖动、自定义QToolButton/QPushButton开关按钮、界面阴影,声音等总结的更多相关文章

  1. 29.QT主窗口加widget

    运行效果 widget布局showwidget.h #ifndef SHOWWIDGET_H #define SHOWWIDGET_H #include <QWidget> #includ ...

  2. QT自定义窗口(模拟MainWindow)

    在这里自定义窗口是通过继承于QFrame,内部分为上下两部分,上半部分就是标题栏,下面是窗口的具体内容.上下两部分通过布局固定位置.最后窗口的各种鼠标拖动,缩放,等操作通过添加鼠标事件来完成一个窗口的 ...

  3. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  4. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

  5. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  6. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...

  7. C++ GUI Qt4编程-创建自定义窗口部件

    C++ GUI Qt4编程-创建自定义窗口部件   Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...

  8. WPF 自定义窗口

    在WPF中,经常需要对窗口进行设置,下面讲讲常用的几个设置. 1.无边框窗口 WindowStyle="None" 窗口样式无 AllowsTransparency="T ...

  9. wpf 自定义窗口,最大化时不覆盖任务栏

    相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 WindowState="Maximized& ...

随机推荐

  1. java笔试之输出

    1. public class foo { private static void testMethod(){ System.out.println("testMethod"); ...

  2. prototype 和 __proto__

    /* * 1.构造函数里有属性及方法----->其构造的实例对象直接通过new构造时获得这些属性和方法 * 2.构造函数里的原型prototype----->这个原型对象:包括1).原型对 ...

  3. [翻译] Visual Studio 2019 RC版发布

    [翻译] Visual Studio 2019 RC版发布 原文: Visual Studio 2019 Release Candidate (RC) now available 今天,我们将分享 V ...

  4. js实用方法记录-指不定哪天就会用到的js方法

    js实用方法记录-指不定哪天就会用到的js方法 常用或者不常用都有 判断是否在微信浏览器中 测试代码:isWeiXin()==false /** * 是否在微信中 */ function isWeix ...

  5. Gephi安装过程中出现错误:can’t find java 1.8 or higher

    Gephi具体的安装过程我就不多说了,一直点击下一步就OK了,我想说的是出现如下图这种或者类似的错误怎么解决. 在百度的过程中发现很多的博文等等出现这个错误的解决方法都是安装对应版本的JDK啊,配置对 ...

  6. 7.侧滑、ViewDragHelper、属性动画

    实现这样的效果: ## 侧滑面板(对ViewGroup的自定义)* 应用场景: 扩展主面板的功能* 功能实现: > 1. ViewDragHelper: Google2013年IO大会提出的, ...

  7. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

    前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...

  8. 课程五(Sequence Models),第二 周(Natural Language Processing & Word Embeddings) —— 2.Programming assignments:Emojify

    Emojify! Welcome to the second assignment of Week 2. You are going to use word vector representation ...

  9. Microsoft 机器学习产品体系对比和介绍

    Microsoft 提供多种多样的产品选项用于生成.部署和管理机器学习模型. 本文将比较这些产品,并帮助你选择所需的产品,以便最有效地开发机器学习解决方案. 机器学习产品 描述 作用 Azure云端服 ...

  10. springboot Aop 统一处理Web请求日志

    1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...