看到很多软件,尤其是游戏软件,有一些炫酷的界面,一直在想,他们究竟是怎么做到的呢?那明明是一张图片啊。
天下有我大QT做不到的事情吗?当然没有!
现在开始:请准备一张带有透明区域的png图片哦。还有就是头文件请加入#include<QBitmap>,看到后面你就明白啦,不然会报错的哦。
首先来看自定义不规则窗口的代码吧:
-
Widget::Widget(QWidget *parent)
-
: QWidget(parent)
-
{
-
this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinimizeButtonHint);
-
this->setAttribute(Qt::WA_TranslucentBackground);
-
pix.load(
":/new/prefix1/201409091359143092.png");
-
this->resize(pix.size());
-
}
-
void Widget::paintEvent(QPaintEvent *e)
-
{
-
QPainter painter(this);
-
painter.drawPixmap(
0,
0,pix);
-
}
这里一定要把绘制写到paintevent里面,构造函数也一定要调用resize。
然后看看界面吧。
这界面够复杂了吧?还有谁!你可以在上面添加控件哦。这里绝不仅仅是显示图片,仔细研究可以看出,窗体是这个可见区域,其他不可见的,并不是窗体,这才是真正的不规则。
当然,因为去掉了标题栏,所以窗体的移动事件,需要自己重写,貌似也不难。
还有一种
或许你并不喜欢这种方式,你就想要setstylesheet方式,那么请看如下代码哦。
-
#include <QStyleOption>
-
-
-
-
-
Widget::Widget(QWidget *parent)
-
: QWidget(parent)
-
{
-
this->resize(
400,
400);
-
setWindowOpacity(
1);
-
setWindowFlags(Qt::FramelessWindowHint);
-
setAttribute(Qt::WA_TranslucentBackground);
-
this->setStyleSheet(
"background-image: url(:/new/prefix1/201409091359143092.png)");
-
-
}
-
void Widget::paintEvent(QPaintEvent *e)
-
{
-
QStyleOption opt;
-
opt.initFrom(
this);
-
QPainter p(this);
-
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p,
this);
-
QWidget::paintEvent(e);
-
}
这样也是可以的。
接下来是不规则按钮
-
QPixmap pix;
-
pix.load(
":/new/prefix1/111.png");
-
ui->pushButton->setFixedSize(pix.size());
-
ui->pushButton->setMask(pix.mask());
-
ui->pushButton->setStyleSheet(
"background-image: url(:/new/prefix1/111.png)");
这段代码要说一下原理。mask其实获取的是alpha通道的信息,然后显示,这就导致一个问题,图片在显示的的时候,会变色了,所以我们要给这个按钮指定一下背景,背景和它一起重叠,就正常显示了。话说至于那个窗体为什么不需要这样做,这个没有研究过……
效果图:
这个按钮够奇葩了吧,四周可以单击,中间不可以单击。不过呢,你的按钮图片不能过于复杂,比如上面窗体的那个图就不行,会出现卡顿或者不显示的问题。
好了,结束。
说到这里突然想起来setmask函数是可以直接接受bitmap类型图片的,但是似乎不行。
比如像这样:
-
QBitmap bit;
-
bit.load(
":/new/prefix1/222.bmp");
-
ui->pushButton->setMask(bit);
-
ui->pushButton->setStyleSheet(
"background-image: url(:/new/prefix1/222.bmp)");
这段代码导致一个问题是图片颜色变化,后来我尝试各种方法也不奏效,甚至这段代码还会导致按钮单击的时候卡顿,目前不知道原因,尽量不用就好了。
奇葩效果如下: