29.QT-自定义窗口拖动、自定义QToolButton/QPushButton开关按钮、界面阴影,声音等总结
自定义窗口及拖动
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开关按钮、界面阴影,声音等总结的更多相关文章
- 29.QT主窗口加widget
运行效果 widget布局showwidget.h #ifndef SHOWWIDGET_H #define SHOWWIDGET_H #include <QWidget> #includ ...
- QT自定义窗口(模拟MainWindow)
在这里自定义窗口是通过继承于QFrame,内部分为上下两部分,上半部分就是标题栏,下面是窗口的具体内容.上下两部分通过布局固定位置.最后窗口的各种鼠标拖动,缩放,等操作通过添加鼠标事件来完成一个窗口的 ...
- QT笔记之自定义窗口拖拽移动
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...
- Qt自定义窗口部件
QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...
- Qt入门(19)——自定义窗口部件
我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange(). void setRange( int minVal, int maxV ...
- QT自定义窗口
qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...
- C++ GUI Qt4编程-创建自定义窗口部件
C++ GUI Qt4编程-创建自定义窗口部件 Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...
- WPF 自定义窗口
在WPF中,经常需要对窗口进行设置,下面讲讲常用的几个设置. 1.无边框窗口 WindowStyle="None" 窗口样式无 AllowsTransparency="T ...
- wpf 自定义窗口,最大化时不覆盖任务栏
相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 WindowState="Maximized& ...
随机推荐
- Batch_Size 详解
Batch_Size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开. 首先,为什么需要有 Batch_Size 这个参数? Batch 的选择,首先决定的是下降的方向.如果数据集比较小 ...
- Android JNI 学习(五):References Api
1. NewGlobalRef(创建全局引用) jobjectNewGlobalRef(JNIEnv *env, jobject obj); 创建 obj 参数所引用对象的新全局引用.obj 参数既可 ...
- Git使用详细教程(3):git add, git commit详解
在使用git之前,我们首先要初始化一个git管理的仓库,这里以博客(blog)为例 git init blog 我们进入目录,执行git status查看git状态,可以看到一个新的git管理的项目目 ...
- #Java学习之路——基础阶段(第一篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- Kali学习笔记34:配置TFTP和FTP服务
配置TFTP: 默认情况下windowsXP和2003是开启TFTP服务的 其他windows到控制面板设置好就行 kali系统也是安装了TFTP服务的:atftpd 下面是一些配置并放入一个文件 w ...
- [Swift]枚举类型:UIBarButtonItem的24种样式
UIBarButtonSystemItemFlexibleSpace 可变空白, 在调用的过程中,使用 UIBarButtonSystemItemFlexibleSpace去占位,达到实现规范化的目 ...
- Oracle sql共享池$sqlarea分析SQL资源使用情况
遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql.$ssssion.$sqlarea进行统计排查 排查时可以先看一下$sql和$session的基本信息 select * fr ...
- BaseDao优化
BaseDao优化2种方法 1. try { //读取配置文件,配置文件保存了数据库的东西 String path=”database.properties”; //创建实例化对象 Propertie ...
- css、css3总结
关于figure元素和figcaption元素的解释与应用: https://www.w3cplus.com/html5/quick-tip-the-right-way-to-use-figure-a ...
- 在vue 中使用 less
1.安装 npm install --save-dev less less-loader npm install --save-dev style-loader css-loader 先在index. ...