文档章节

Qt不规则窗体组合的使用

BB计划
 BB计划
发布于 2014/05/30 09:40
字数 840
阅读 31
收藏 0
点赞 0
评论 0

这个题目来源自安防产品,需要把一系列不规则的窗口整个成一个特定的形状,这里需要组合成圆形。

在这里使用的是QtCreator作为编辑工具。

首先,拖一些控件到主窗体,

第2步,创建一个扩展过的类

头文件:

#ifndef QEXPUSHBUTTON_H
#define QEXPUSHBUTTON_H

#include <QWidget>
#include <QPushButton>
#include <QPixmap>

class QExPushButton : public QPushButton
{
    Q_OBJECT
public:
    explicit QExPushButton(QWidget *parent = NULL);
    void setPixmap(const QString strPath, float wScaled = 1, float hScaled = 1);
    void setPixmapPressed(const QString strPath, float wScaled = 1, float hScaled = 1);

    void setPixmap(const QPixmap & strPath, float wScaled = 1, float hScaled = 1);
    void setPixmapPressed(const QPixmap & strPath, float wScaled = 1, float hScaled = 1);
signals:
    void pressed();

    void released();
public slots:
protected:
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
protected:
    QPixmap m_pixReleased;
    QPixmap m_pixMask;
    QPixmap m_pixPressed;
    bool m_binit;
};

#endif // QEXPUSHBUTTON_H

源文件:

#include "QExPushButton.h"
#include <QPainter>
#include <QMessageBox>
#include <QBitmap>
#include <QMouseEvent>
#include <Qdebug>
QExPushButton::QExPushButton(QWidget *parent) :
    QPushButton(parent)
{
    m_binit = false;

}

void QExPushButton::setPixmap(const QPixmap & pixmap, float wScaled, float hScaled)
{
    m_pixReleased = pixmap;
    m_pixReleased = m_pixReleased.scaled(m_pixReleased.width() * wScaled, m_pixReleased.height() * hScaled);
    if (!m_binit)
    {
        m_pixMask = m_pixReleased;
        setMask(QBitmap(m_pixMask.mask()));
        m_binit = true;
    }
}

void QExPushButton::setPixmap(const QString strPath, float wScaled, float hScaled)
{
    m_pixReleased = QPixmap(strPath);
    m_pixReleased = m_pixReleased.scaled(m_pixReleased.width() * wScaled, m_pixReleased.height() * hScaled);
    if (!m_binit)
    {
        m_pixMask = m_pixReleased;
        setMask(QBitmap(m_pixMask.mask()));
        m_binit = true;
    }
}

void QExPushButton::setPixmapPressed(const QPixmap & strPath, float wScaled, float hScaled)
{
    m_pixPressed = strPath;
    m_pixPressed = m_pixPressed.scaled(m_pixPressed.width() * wScaled, m_pixPressed.height() * hScaled);
}
void QExPushButton::setPixmapPressed(const QString strPath, float wScaled, float hScaled)
{
    m_pixPressed = QPixmap(strPath);
    m_pixPressed = m_pixPressed.scaled(m_pixPressed.width() * wScaled, m_pixPressed.height() * hScaled);
}
void QExPushButton::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(0, 0, m_pixMask);
}

void QExPushButton::mouseReleaseEvent(QMouseEvent *e)
{
    if (e->button() != Qt::LeftButton)
    {
        e->ignore();
    }
    if (e->type() == QEvent::MouseButtonRelease)
    {
        m_pixMask = m_pixReleased;
        qDebug() <<"MouseButtonRelease";
        repaint();
        emit released();
    }
}

void QExPushButton::mousePressEvent(QMouseEvent *e)
{
    if (e->button() != Qt::LeftButton)
    {
        e->ignore();
    }
    if (e->type() == QEvent::MouseButtonPress)
    {
        m_pixMask = m_pixPressed;
        qDebug() <<"MouseButtonPress";
        repaint();
        emit pressed();
    }
}

接下来,需要在界面窗体将button控件提升一下:

右键,提升,然后输入类名称即可。

接下来要做的事情则比较机械化,就是在主窗体的对应cpp文件中分别设置空间的鼠标按下时的图片和鼠标松开的图片,在这里,请注意偏移量的使用和缩放比例的使用,有时候会很有用。

#include "mainwindow.h"
#include "QExPushButton.h"
#include <QPixmap>
#include <QIcon>
#include <QBitmap>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{

    setupUi(this);
    // 1 先计算出屏幕缩放比例
    float fwscaled = 1;
    float fhscaled = 1;

    // 2 所有的按钮同一个偏移量
    int h = 0;
    int w = 0;
    //中心按钮略有不同,这和中心按钮的原始大小有关系
    int hcenter = 1;
    int wcenter = 1;

    // 3 所有的按钮同一个大小

    QSize size(205, 205);
    size.setWidth(size.width() * fwscaled);
    size.setHeight(size.height() * fhscaled);


    QSize sizeCenter(230, 230);
    sizeCenter.setWidth(sizeCenter.width() * fwscaled);
    sizeCenter.setHeight(sizeCenter.height() * fhscaled);



    ptn_up->resize(size);
    ptn_up->move(w, h);
    ptn_leftUp->resize(size);
    ptn_leftUp->move(w, h);
    ptn_left->resize(size);
    ptn_left->move(w, h);
    ptn_leftDown->resize(size);
    ptn_leftDown->move(w, h);
    ptn_down->resize(size);
    ptn_down->move(w, h);
    ptn_rightDown->resize(size);
    ptn_rightDown->move(w, h);
    ptn_right->resize(size);
    ptn_right->move(w, h);
    ptn_rightUp->resize(size);
    ptn_rightUp->move(w, h);


    ptn_up->setPixmapPressed(":/res/11up.png", fwscaled, fhscaled);
    ptn_leftUp->setPixmapPressed(":/res/11leftUp.png", fwscaled, fhscaled);
    ptn_left->setPixmapPressed(":/res/11left.png", fwscaled, fhscaled);
    ptn_leftDown->setPixmapPressed(":/res/11leftDown.png", fwscaled, fhscaled);
    ptn_down->setPixmapPressed(":/res/11down.png", fwscaled, fhscaled);
    ptn_rightDown->setPixmapPressed(":/res/11rightDown.png", fwscaled, fhscaled);
    ptn_right->setPixmapPressed(":/res/11right.png", fwscaled, fhscaled);
    ptn_rightUp->setPixmapPressed(":/res/11rightUp.png", fwscaled, fhscaled);

    ptn_up->setPixmap(":/res/1up.png", fwscaled, fhscaled);
    ptn_leftUp->setPixmap(":/res/1leftUp.png", fwscaled, fhscaled);
    ptn_left->setPixmap(":/res/1left.png", fwscaled, fhscaled);
    ptn_leftDown->setPixmap(":/res/1leftDown.png", fwscaled, fhscaled);
    ptn_down->setPixmap(":/res/1down.png", fwscaled, fhscaled);
    ptn_rightDown->setPixmap(":/res/1rightDown.png", fwscaled, fhscaled);
    ptn_right->setPixmap(":/res/1right.png", fwscaled, fhscaled);
    ptn_rightUp->setPixmap(":/res/1rightUp.png", fwscaled, fhscaled);


    ptn_center->resize(sizeCenter);
    ptn_center->move(wcenter, hcenter);

    //中心按钮再次缩放
    float fcenter = 0.92;
    QPixmap pix(":/res/ptz.png");
    ptn_center->resize(pix.size());
    ptn_center->setPixmap(":/res/ptz.png", fwscaled * fcenter, fhscaled * fcenter);
    ptn_center->setPixmapPressed(":/res/ptz.png", fwscaled * fcenter, fhscaled * fcenter);
}

MainWindow::~MainWindow()
{



}

最后,看一下效果图:

注意,我使用的小图片的尺寸都是一样的,

© 著作权归作者所有

共有 人打赏支持
BB计划
粉丝 0
博文 8
码字总数 2859
作品 0
广州
程序员
QT中不规则窗体和部件的实现

Qt中不规则窗体和部件的实现,不管是窗体还是部件,都是从QWidget派生而来的,所以它们的原理是一样的,都是设置部件的背景色或者按钮图标等为一个图像A,然后设置此部件的掩码为另一个图像B...

晨曦之光
2012/04/13
203
0
Qt日记(2)-360新版特性界面实现(2)

1.UI的结构 开始画图形界面,首先确定UI的大小,找到360新版特性界面的皮肤,可以看到: 4个不同的页面的像素为:680 370 而最顶层的一层透明页面像素为:680 372 如图: QSize(680, 370): Q...

晨曦之光
2012/05/24
1K
0
Ubuntu 14.04下搭建Python3.4 + PyQt5.4.0 + Eric6.0开发平台

简要说明:QT是一个跨平台界面库和开发工具集,PyQt是其Python封装模块,其封装采用Sip完成(可以让C++库直接在Python中调用),Eric是基于Python的一个代码编辑器。 引言 找了很多Python GU...

openthings
2015/01/22
0
3
常见的几个Qt编程问题的处理

1、如果在窗体关闭前自行判断是否可关闭 答:重新实现这个窗体的closeEvent()函数,加入判断操作 引用 void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettin...

红薯
2010/09/09
872
1
Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台

Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台 分类: Linux Ubuntu Oracle 2014-10-14 14:49 3613人阅读 评论(13) 收藏 举报 UbuntuPythonSIPPyQt5Eric6 目录(?)[+] 引言 找了......

Sophia_tj
2015/02/28
0
0
QWidget 之paint部分杂记

Qt4.0 在Qt 4.0中,启用双缓冲,不必在paintEvent()中编写双缓冲代码来避免闪烁。 Qt4.1 在Qt 4.1中,通过启用背景自动传递(propagation),widget不再有任何默认的背景。引入backingstore这个...

晨曦之光
2012/05/08
385
0
QMainWindow之Dock Widget若干BUG小记

QTBUG8107 在QMainWindow中,我们可以通过拖动中心窗体和停靠窗体之间的分割线(Sepearator)来改变中心窗口的大小。 QTBUG8107描述这样一个问题: 当通过拖动Sepearator改变了停靠窗体的大小后...

晨曦之光
2012/05/08
664
0
《Qt 实战一二三》

简介 “我们来自Qt分享&&交流,我们来自QML分享&&交流”,不管你是笑了,还是笑了,反正我们是认真的。我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度...

u011012932
2015/12/12
0
0
Qt中动态加载窗口

在编程中,我经常会遇见要根据用户触发按钮,动态生成窗口的情况。在此有两种方法可以动态生成窗口:一:直接在槽函数中调用窗口类。二:将**.ui添加到资源文件,通过QUiLoader加载。 现将两...

乔三爷
2017/08/06
17
0
QT QWidget设置窗体透明度方法汇总

1、设置窗体的背景色 在构造函数里添加代码,需要添加头文件qpalette或qgui QPalette pal = palette(); pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); setPalette(pal)......

霄霄月月
2012/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
2分钟前
0
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
6分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
8分钟前
0
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
8分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
13分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
16分钟前
0
0
Java NIO:浅析I/O模型

也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念...

yzbty23
16分钟前
0
0
了解iOS消息推送一文就够:史上最全iOS Push技术详解

本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会...

JackJiang-
18分钟前
0
0
Mysql汉子转拼音

update t_app_city SET CITY_NAME_BEGIN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(CITY_NAME USING gbk),1)),16,10), 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, 0xBFA......

尘叙缘
20分钟前
0
0
大数据构建智慧城市“新引擎”,加速推进新旧动能转换

——“大数据与智慧城市”技术交流分享会——济南站召开 7月13日,“大数据携手智慧城市,助力山东新旧动能转换”技术交流分享会——济南站在山东信息通信技术研究院会议室成功举办,此次会议...

左手的倒影
22分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部