文章目录
1.QDesktopServices调用桌面服务
QDesktopServices类提供了访问常见桌面服务的方法。许多桌面环境提供的服务可被应用程序用于执行常见任务,如打开网页,其方式既一致又考虑到用户的应用程序偏好。该类包含为这些服务提供简单接口的函数,这些接口指示服务是否成功。包括了打开本地文件(远程也可以)、获取桌面、我的文档、Home目录、打开网页等。
当做GUI应用时需要打开某个资源时常常用到这种方法,或者当生成某个文件后立即打开的操作也需要用到这个类。前面文章中提到,使用Qt Network模块的类包括QNetworkRequest、QNetworkReply和QNetworkAccessManager,使用通用的协议来执行网络操作,可以说也能打开一个网页,二者的区别是QDesktopServices调用的是系统提供的桌面服务,或者说系统的应用被调用了,而Network则是自己创建一个应用,这个应用可以发起http请求,看起来也是打开了一个网页。QProcess类也可以打开本地目录,在实现的方法上有些区别,代码中注释清楚,下面粘贴代码与效果,比较简单,实际应用中稍作适配即可使用。
1.1.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDesktopServices>
#include <QUrl>
#include <QProcess>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_btn_openWeb_clicked();
void on_btn_openFoder_clicked();
void on_btn_openFoderByPro_clicked();
void on_btn_openFile_clicked();
private:
Ui::Widget *ui;
QDesktopServices * myService;
};
#endif // WIDGET_H
1.2.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myService = new QDesktopServices();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn_openWeb_clicked()
{
//打开晓晓暮雨潇潇主页
QUrl url(QString("https://blog.csdn.net/weixin_40615338?spm=1011.2124.3001.5343"));
myService->openUrl(url);
}
void Widget::on_btn_openFoder_clicked()
{
//打开本地系统目录
QDesktopServices::openUrl(QUrl("C:/", QUrl::TolerantMode));
}
void Widget::on_btn_openFoderByPro_clicked()
{
//使用QProcess打开资源管理器指定目录
QString local_path = QString("E:\\新建文件夹");
QProcess::startDetached("explorer " + local_path);
}
void Widget::on_btn_openFile_clicked()
{
QString strUrl =QString::fromLocal8Bit("file:///E:\\Day26.txt");
QUrl url(strUrl);
myService->openUrl(url);
}
1.3效果
例如单击打开文件按钮时,效果如下
1.4QGroupBox样式表
这是我在网络上随便粘贴了一个样式表,你会发现,Qt可以做出很漂亮的界面,后续我会出专栏介绍样式表的强大和魅力。
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #E0E0E0, stop: 1 #FFFFFF);
border: 4px solid gray;
border-radius: 5px;
margin-top: 24px;
2.QSplashscreen制作程序启动画面
在大型程序启动之前,通常都有一个动画界面,之后才能进入软件界面。例如vivado、eclipse、Altium Designer等。在程序启动时,通常需要导入配置数据,读取用户文件,进行网络初始化等操作,为了避免用户因这个等待导致用户体验差,通常均用一小段动画,或者图片,进度条的形式显示。在Qt开发的应用程序中,使用QSplashscreen可以完成这一操作。
通常在main函数中的主界面显示之前完成这个操作,如果显示图片则使用QPixmap构造;如果显示动画gif则需要使用QMovie构造,并将gif放在以splashscreen为父对象的Qlabel上操作。下面示例中显示了图片效果,代码简单,使用时可直接黏贴。
2.1main代码
请关注注释
#include "widget.h"
#include <QApplication>
#include <QPixmap>
#include <QSplashScreen>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QPixmap pix(":/screen.png");//应用程序加载图片
QSplashScreen myScreen(pix);//构造显示屏幕
myScreen.show();//启动动画显示
for(int i = 0;i<800000000;i++);//停留 延时
//在finish之前,你可以进行自定义应用中所需的操作,例如初始化,文件读取等操作
myScreen.finish(&w);//结束
w.show();
return a.exec();
}
2.2效果
3.QSharememory实现一个实例启动
在某些应用中,只希望在同一时刻只运行一个程序。实现这个实例依据的主要原理是进程间通信,即先启动的程序A与后启动的程序B二者之间通信。**共享内存便是进程之间通信的常用手段。**创建一个场景,如果attach返回true,则说明程序已经启动,共享内存已经创建,此时退出程序。若程序未启动,则创建共享内存启动程序。其主要代码是在main函数中,如下所示。
3.1main文件
#include "widget.h"
#include <QSharedMemory>
#include <QApplication>
#include <QMessageBox>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSharedMemory shared("a");
if(shared.attach())//共享内存被占用则直接返回
{
QMessageBox::information(NULL,QStringLiteral("Tips"),QStringLiteral("App is running!"));
qApp->quit();//退出当前程序
return 0;
}
shared.create(1);//共享内存没有被占用则创建UI
Widget w;
w.show();
return a.exec();
}
3.2效果
当前已经有一个程序启动的时候,再去启动第二个程序,则会提示用户并退出。
4.传送门
END |
🎏文章原创,首发于CSDN论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。