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

it2023-11-20  61

目录

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


1.简介

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

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

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

回目录

2.效果图

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单例不规则界面程序重复启动警告提示

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.hwidget.cpp
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)