您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记:自定义窗体的移动+控件图标

2017-11-16 13:34 513 查看
在这里首先感谢刘大师的作品:Qt编写通用主界面导航(开源)

贴上演示:



本博客主要是研究了刘大师的作品然后自己总结,做点笔记。。不喜勿喷~~~

废话不多说,先贴出代码解析一下:

AppInit::Instance()->start();


单例模式 Instance()

首先说说这个这个Instance(),本人由于是C++新手,对此有好多C++知识不懂。因此在这里记录一下:

这个Instance() 介绍说用于单例模式 : 用来保证系统中只有一个实例。

.h 文件中 class类的定义:

static AppInit *Instance();
private:
static AppInit *self;


.c文件中

AppInit *AppInit::self = 0;//静态成员变量需要在类体外面进行初始化。
AppInit *AppInit::Instance()
{
if (!self) {
QMutex mutex;//保护一个对象,同一时间只能由一个线程进行访问。
QMutexLocker locker(&mutex);//加锁
if (!self) {
self = new AppInit;//创建一个AppInit对象
}
}

return self;
}


使用时,采用:

AppInit::Instance()->satrt();


通过这种方式进行类实例的调用,保证单例模式的进行。

(2). 自定义窗体的移动:

在main 函数中,首先调用这句话,


AppInit::Instance()->start();


执行单例模式,并且加载事件过滤器。

然后在新建的窗体Widget构造函数中,调用以下函数,这里设置窗体属性(property)是为了对应qApp中加载的事件过滤器。使其能够实现窗体的移动。

this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);//去除标题栏
this->setProperty("canMove", true);//将对象的名称属性的设置为canMove。 可以移动


在AppInit .c文件中:

//加载事件过滤器
void AppInit::start()
{
qApp->installEventFilter(this);
}

//重写事件过滤器
bool AppInit::eventFilter(QObject *obj, QEvent *evt)//参数:对象,事件
{
QWidget *w = (QWidget *)obj;//强制转换为QWidget
if (!w->property("canMove").toBool())//得到QWidget的属性是canMove(可以移动)。
{
return QObject::eventFilter(obj, evt);
}

static QPoint mousePoint;//静态变量 --> 鼠标坐标
static bool mousePressed = false;

QMouseEvent *event = static_cast<QMouseEvent *>(evt);
if (event->type() == QEvent::MouseButtonPress)//事件类型  鼠标按钮按下
{
if (event->button() == Qt::LeftButton) //左键
{
mousePressed = true;
mousePoint = event->globalPos() - w->pos();
return true;
}
}
else if (event->type() == QEvent::MouseButtonRelease) //事件类型  鼠标按钮释放
{
mousePressed = false;
return true;
}
else if (event->type() == QEvent::MouseMove)//事件类型  鼠标移动
{
if (mousePressed && (event->buttons() && Qt::LeftButton))
{
w->move(event->globalPos() - mousePoint);//窗体移动坐标
return true;
}
}

return QObject::eventFilter(obj, evt);
}


(3)控件图标:

这里的控件图标实现,主要是采用:fontawesome图标

fontawesome是一个图标的集合,里面有好多的图标,使用起来也还是非常方便的。

图标信息可以到官网去查:http://fontawesome.io/cheatsheet/

fontawesome-webfont.ttf 下载地址:http://pan.baidu.com/s/1sjyvp3v

具体的实现重要是通过调用以下函数:

QPushButton * Btn = new QPushButton(widget);
IconHelper::Instance()->SetIcon(Btn, QChar(0xf192), 12);


其中的QChar(0xf192) 是fontawesome是图标集合中一个图标对应的uncode编码。使用不同的uncode编码即对应了不同的图标。

这里还可以的根据指定的绘制得到需要的pixmap

//依据 宽度,高度,大小,图标uncode十六进制编码,颜色  绘制图片
QPixmap IconHelper::getPixmap(const QString &color, QChar c, quint32 size,
quint32 pixWidth, quint32 pixHeight)
{
QPixmap pix(pixWidth, pixHeight);//定义一个对象
pix.fill(Qt::transparent);//透明的黑色值(即,QColor(0,0,0,0))填充

QPainter painter;//定义绘图对象
painter.begin(&pix);//调用begin时,所有的Pen Brush 重置为默认值。
//设置给定的绚染提示: 抗锯齿+ 抗锯齿文本
painter.setRenderHints(QPainter::Antialiasing |QPainter::TextAntialiasing);
painter.setPen(QColor(color));
painter.setBrush(QColor(color));

iconFont.setPointSize(size);
painter.setFont(iconFont);//设置字体
painter.drawText(pix.rect(), Qt::AlignCenter, c);//画图标 设置文本中央对齐,
painter.end();//结束绘画。 绘画时使用的任何资源都被释放。

return pix;
}


通过调用:

QPixmap pix = IconHelper::Instance()->getPixmap(listColorText.at(i), listChar.at(i), iconSize, iconWidth, iconHeight);//根据指定绘制图标样式
btn->setIcon(QIcon(pix));//设置图标


项目代码在我的github仓库:

https://github.com/xiedonghuilove/Package/tree/master/QFreamWork/uidemo18
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: