目录
1.简介
本文主要介绍了如何实现Qt单例不规则界面程序,重点内容包含
- 如何实现单例程序;
- 如何实现不规则界面。
本文还有动态效果图、重点讲解和源码,读者们可以方便查看学习和交流。
回目录
2.效果图
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;
}
下面是重复启动程序时的提示警告信息:
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!