- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
使用样式表可以实现矩形、圆形等规则形状的部件,不过,有时想设计一个不规则形状的部件或者窗口,使得应用程序的外观更加个性化。Qt中提供了部件遮罩( mask)
来实现不规则窗体。
新建Qt Widgets应用,项目名称为mymask,基类选择QWidget,类名保持Widget不变。完成后向项目目录中放一张背景透明的PNG图片(笔者这里是yafeilinux.png),然后再向项目中添加一个Qt资源文件,建立好后先添加前缀“/image”,然后再将图片添加进来并保存更改。然后到设计模式,向界面上拖入一个Label,设置其宽度为56,高度为67。下面到 widget. cpp文件中,先添加头文件包含:
#include <QPixmap>
#include <QBitmap>
#include <QPainter>
再到构造函数中添加如下代码:
QPixmap pixmap(":/image/yafeilinux.png");
ui->label->setPixmap(pixmap);
ui->label->setMask(pixmap.mask());
这里使用QPixmap类加载了资源文件中的图片,使用setPixmap()为标签设置了图片,最后调用QLabel的 setMask()
函数为标签设置了遮罩。这时运行程序可以看到,标签部件显示成了图片的形状。
下面来看下怎样为整个窗口设置遮罩。进入 widget.h文件,声明两个事件处理函数:
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);
然后再到widget.cpp文件中,注释掉前面lebel-setPixmap的构造函数的代码,并添加如下:
QPixmap pix;
// 加载图片
pix.load(":/image/yafeilinux.png");
// 设置窗口大小为图片大小
resize(pix.size());
// 为窗口设置遮罩
setMask(pix.mask());
这里调用setMask来设置遮罩。下面添加二个事件处理函数的定义:
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
// 从窗口左上角开始绘制图片
painter.drawPixmap(0, 0, QPixmap(":/image/yafeilinux.png"));
}
void Widget::mousePressEvent(QMouseEvent *)
{ // 关闭窗口
close();
}
必须在paintEvent()函数中将图片绘制在窗口上,这样运行程序时才可以正常显示图片.
鼠标按下事件中只是进行了简单的关闭窗口操作
窗口变为图片的形状
这个程序中使用了一张图片来为部件或者窗口设置遮罩,其实还可以使用QRegion
设置一个区域来作为遮罩,这个就不再讲解了,有兴趣的读者可以参考QWidget的setMask( const QRegion ®ion)
函数。
只需要设置背景色指定alpha即可
QPushButton{background-color:rgba(255,255,255,100)}
其中,rgba()中的a就是指alpha, 它的取值为0~255,取值为0时完全透明,取值为255时完全不透明。
这里a的值为100,这样会出现半透明的效果,因为前面的r
(红)、g(绿)、b(蓝)的值均为255,所以是白色,最终的效果是按钮的背景为半透明的白色。
部件的透明效果可以使用这种方式来设置,但是,作为顶级部件的窗口却无法使用这种方式来实现透明效果。
不过,可以使用其他两种方法来实现透明效果。
新建Qt Widgets 应用,项目名称为mytranslucent,基类选择QWidget,类名保持Widget 不变。
建好项目后,在设计模式向界面上拖入一个Label、一个Push Button和一个Progress Bar,
然后在widget.cpp文件中的构造函数里添加一行代码:
// // 设置窗口的不透明度为0.5
setWindowOpacity(0.5);
使用setWindowOpacity()
函数就可以实现窗口的透明效果,它的参数取值范围为0.0~1.0,取值为0.0时完全透明,取值为1.0时完全不透明。
这时运行程序,效果如图所示。
可以看到,这样实现的效果是整个应用程序界面都是半透明的,如果不想让窗口中的部件透明,那该怎么实现呢?下面来看另一种方法。
先将构造丽数中的setWindowOpacity()函数调用注释掉,然后再添加下面两行代码:
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
这里使用了setAttribute()
函数指定窗口的Qt:: WA_TranslucentBackground
属性,它可以使窗体背景透明,而其中的部件不受影响。不过在Windows下,还要使用setWindowFlags()
函数指定Qt::FramelessWindowHint
标志,这样才能实现透明效果。
这时运行程序会发现,窗口没有了标题栏,这时要想关闭窗口,就要使用Qt Creator应用程序输出栏上的红色按钮来强行关闭程序。这样实现的效果是背景完全透明的。
要是还想实现半透明效果,可以使用重绘事件。
先在widget. h文件中声明paintEvent()函数:
protected:
void paintEvent(QPaintEvent *);
然后到widget.cpp文件中添加头文件#include< QPainter>,再添加paintEvent()函数
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.fillRect(rect(), QColor(255,255,255,100));
}
这里先使用rect()
函数获取窗口的内部矩形,它不包含任何边框。然后使用半透明的白色对这个矩形进行填充,可以运行程序查看运行效果。
fillRect()
函数可以指定任意的一个区域,所以可以实现窗体的部分区域全部透明,部分区域半透明或者不透明的效果。
使用第一种方法会使整个应用程序都成为半透明效果;第二种方法可以实现只是顶层窗口的背景透明,不过,它没有了标题栏和边框,还需要手动为其添加一个标题栏。另外,使用第11章讲到的图形效果也可以实现部件的透明效果,而且使用它还可以实现模糊、阴影和染色等特殊效果。
下面接着在widget.cpp文件中添加头文件包含#include< QGraphicsDropShadowEffect>,然后在构造函数中添加如下代码;
// 创建阴影效果
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
// 设置阴影颜色
effect->setColor(QColor(100, 100, 100, 100));
// 设置阴影模糊半径
effect->setBlurRadius(2);
// 设置阴影偏移值
effect->setOffset(10);
// 标签部件使用阴影效果
ui->label->setGraphicsEffect(effect);
为标签部件设置了阴影效果,如果要设置透明效果,可以创建QGraphicsOpacityEffect
对象,然后使用setOpacity()
设置透明度即可
下面就来看一下如何实现毛玻璃窗口效果。本小节内容可以在帮助中通过Qt Windows Extras Overview
关键字查看。
新建Qt Widgets应用,项目名称为mydwm,类名为MainWindow,基类为QMain Window保持不变。建好项目后,在设计模式向界面上拖人一个Label并修改显示文本为“毛玻璃窗口效果”,然后在mydwm.pro中添加一行代码:
QT += winextras
下面打开widget.cpp文件,添加头文件#include< QtWinExtras>,再到构造函数里添加代码:
if (QtWin::isCompositionEnabled()) {
QtWin::extendFrameIntoClientArea(this, -1, -1, -1, -1);
setAttribute(Qt::WA_TranslucentBackground, true);
setAttribute(Qt::WA_NoSystemBackground, false);
setStyleSheet("MainWindow { background: transparent; }");
} else {
QtWin::resetExtendedFrame(this);
setAttribute(Qt::WA_TranslucentBackground, false);
setStyleSheet(QString("MainWindow { background: %1; }")
.arg(QtWin::realColorizationColor().name()));
}
这里首先使用isCompositionEnabled ()
判断DWM(Desktop Window Manager,Windows桌面窗口管理器)合成是否可用,当其可用时才可以实现毛玻璃框架效果。
extendFrameIntoClientArea()
可以扩展毛玻璃边框效果到客户区域,第一个参数是要设置的窗口;后面4个参数是左、上、右、下边距,
就是要从窗口的边界开始向内多大区域使用玻璃边框效果,设置为-1表示所有区域都使用毛玻璃效果
。另外,还要使用setAttribute()
设置窗口属性。最后使用setStyleSheet()
设置窗口的背景透明,这里一定要注意,样式表中的选择器要设置为窗口的类名。
现在运行程序,效果如图所示。
Qt Windows Extras模块中的其他特色功能这里就不再讲述了,可以参考MusicPlayer示例程序,也可以参考《Qt及 Qt Quick开发实战精解(第2版)》中音乐播放器实例的相关内容。
总结:还是需要CSS的应用
我可以使用 javascript 和其他所有东西,但在重新发明轮子之前,我想知道是否已经有一个类似的 jquery 插件,因为我想使用那个框架而不是 mootools。 我没有钱的问题,特别是 5 欧
我正在 React 应用程序中处理动画。我需要动画在悬停 后开始工作。我尝试了 :hover:after css 但不起作用。将鼠标悬停在图像上后动画可以工作,但我需要在悬停后开始。将鼠标悬停在图像上
我正在使用 jQuery 在按钮单击时实现 slider 效果。我的代码是: $(document).ready(function() { $("#mybutton").click(functio
我需要一个div标签在屏幕右侧滑出,如何使用jQuery获得这种效果?我一直在看这里:http://api.jquery.com/category/effects/sliding/而且这似乎不是我要找
我正在使用此代码实现页面 curl 效果......它在模拟器和设备中工作正常......但它不是(setType:@“pageCurl”)苹果记录的api,这导致它被iPhone拒绝App Stor
我见过各种关于 WPF 效果的引用,但它们似乎是针对位图的,而不是针对文本的。是否可以将除模糊或投影以外的效果应用于XAML中的TextBlock对象? 我想要做的示例可能是轮廓笔划,或斜角/浮雕效果
我见过各种关于 WPF 效果的引用,但它们似乎是针对位图的,而不是针对文本的。是否可以将除模糊或投影以外的效果应用于XAML中的TextBlock对象? 我想要做的示例可能是轮廓笔划,或斜角/浮雕效果
我正在尝试模拟这种效果:http://meyerweb.com/eric/css/edge/complexspiral/demo.html在我的博客上:http://segment6.blogspot
我尝试将样式应用到 Accordion Pane ,但遇到了问题。 这行不通。 accordion.setEffect(new DropShadow(BlurType.ONE_PASS_BOX, Co
关于 Datatables website 的教程足够清楚了: 在我告诉 Datatables 我正在谈论哪一列后,我只需将切换按钮放入: column.visible( ! column.visib
我正在寻找 scratchOut 效果,随便叫它什么。 这是从前景中删除图像的效果,因此背景图像变得可见。 我曾尝试使用 jquery 插件重新创建此效果,但它并不像我希望的那样流畅。 有没有人有这种
本文实例讲述了android实现文字和图片混排(文字环绕图片)效果。分享给大家供大家参考,具体如下: 在平时我们做项目中,或许有要对一张图片或者某一个东西进行文字和图片说明,这时候要求排版美观,所
本文实例讲述了Javafx简单实现【我的电脑资源管理器】效果。分享给大家供大家参考。具体如下: 1. java代码: ?
我是 ngrx 的新手,正在尝试让我的 ngrx 商店的 @Effect 函数正常工作。下面的代码显示了如果我没有使用 ngrx 商店,服务是如何工作的。我首先调用 http.get 来获取列表,然后
基本上我搜索了很多,解决方案建议应用一些 PNG 掩码或不提供所需的解决方案。 我发现了什么。 ffmpeg -i main.mkv -i facecloseup.mkv -filter_compl
有关使用从商店中选择的状态的效果的 Ngrx 文档状态(没有双关语意) Note: For performance reasons, use a flattening operator like co
我有一个数据网格控件,我在其中使用名为 FastShadow 的自定义效果,它就像一个光晕。 我希望效果在其边界之外发光,这样很好,但是当我在顶部绘制另一个形状时,我不希望这个形状受到影响。在本例中,
除了子 div.exception 中的所有内容,我想将 div.main 中的所有文本设为灰色。 div.exception 应该看起来好像类 main 从未添加到父 div。 这可能吗?如果是这样
我有一个 PDF 文件,我想重现此包页面中的页面 curl 效果: https://pub.flutter-io.cn/packages/page_turn 我试过用这个 page_turn插件,它需
我想测试一个效果如下: 如果调度了 LoadEntriesSucces 操作,则效果开始 等待 5 秒 5 秒后发送 http 请求 当响应到达时,将分派(dispatch)新的操作(取决于响应是成功
我是一名优秀的程序员,十分优秀!