实例QT程序 —— Qt单例不规则界面程序

目录

1.简介
2.效果图
3.重点讲解
4.源码



1.简介

本文主要介绍了如何实现Qt单例不规则界面程序,重点内容包含

  • 如何实现单例程序;
  • 如何实现不规则界面。

本文还有动态效果图、重点讲解和源码,读者们可以方便查看学习和交流。


回目录

2.效果图

Qt单例不规则界面程序
Qt单例不规则界面程序


回目录

3.重点讲解

1)如何实现单例程序

通过共享内存QSharedMemory实例来限制同一个程序的重复启动 。

    QSharedMemory *sharedMemory = new QSharedMemory("SingleApp");
    sharedMemory->attach();
    if(!sharedMemory->create(1))
    {
        QMessageBox::warning(0,QObject::tr("Warning"),
                             QObject::tr("The program is running!"));
        delete sharedMemory;
        a.exit(0);
        return 0;
    }

下面是重复启动程序时的提示警告信息:

Qt单例不规则界面程序重复启动警告提示
Qt单例不规则界面程序重复启动警告提示


2)如何实现不规则界面

  • 新建一个Pixmap对象加载图片;
  • 固定窗口大小,将窗口大小设置为图片大小;
  • 给窗口去掉边框,设置窗口的flags;
  • 设置透明背景。
    //新建一个Pixmap对象
    QPixmap pixmap;

    //加载图片
    pixmap.load(":/66.png");

    //固定窗口大小,将窗口大小设置为图片大小
    setFixedSize( pixmap.width(), pixmap.height() );

    //给窗口去掉边框,设置窗口的flags
    setWindowFlags(Qt::FramelessWindowHint | windowFlags() );

    //设置透明背景
    setAttribute(Qt::WA_TranslucentBackground);

不规则界面的移动操作需要重新实现鼠标点击和移动事件。

protected:
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){  // 求出窗口移动之前的坐标
        m_PointDrag = event->globalPos()-frameGeometry().topLeft();
    }
    if(event->button() == Qt::RightButton){ // 鼠标右键关闭窗口
        close();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {   // 如果是鼠标左键拖动, 移动窗口
        move(event->globalPos() - m_PointDrag);
    }
}

不规则界面还需要重新绘制背景图片。

protected:
     void paintEvent(QPaintEvent *event);
void Widget::paintEvent(QPaintEvent */*event*/)
{
    QPainter painter(this);

    // 重新绘制图片
    painter.drawPixmap(0, 0, QPixmap(":/66.png"));
}

回目录

4.源码

源码下载地址
https://download.csdn.net/download/Redboy_Crazy/12988058

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
     void paintEvent(QPaintEvent *event);
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::Widget *ui;
    QPoint m_PointDrag;      //保存相对距离
};
#endif // WIDGET_H

widget.cpp
#include "widget.h"
#include "ui_widget.h"

#include <QMouseEvent>
#include <QPoint>
#include <QPixmap>
#include <QPainter>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //新建一个Pixmap对象
    QPixmap pixmap;

    //加载图片
    pixmap.load(":/66.png");

    //固定窗口大小,将窗口大小设置为图片大小
    setFixedSize( pixmap.width(), pixmap.height() );

    //给窗口去掉边框,设置窗口的flags
    setWindowFlags(Qt::FramelessWindowHint | windowFlags() );

    //设置透明背景
    setAttribute(Qt::WA_TranslucentBackground);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){  // 求出窗口移动之前的坐标
        m_PointDrag = event->globalPos()-frameGeometry().topLeft();
    }
    if(event->button() == Qt::RightButton){ // 鼠标右键关闭窗口
        close();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {   // 如果是鼠标左键拖动, 移动窗口
        move(event->globalPos() - m_PointDrag);
    }
}

void Widget::paintEvent(QPaintEvent */*event*/)
{
    QPainter painter(this);

    // 重新绘制图片
    painter.drawPixmap(0, 0, QPixmap(":/66.png"));
}

回目录




加油,向未来!GO~
Come on!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值