你是否还在苦恼,自己辛辛苦苦写的代码程序,仅仅只能在自己电脑上运行,却无法发送到好友、舍友电脑上运行,这怎么能行,自己好不容易写的一个逼格高点的程序,怎能不分享给好友、舍友呢?今天这篇文章就教你Qt程序如何打包发送给好友、舍友们运行体验,让你成为他们中最靓的仔!o( ̄︶ ̄)o
一、撸代码
第一步首先是得有代码啊!
当然,这篇博客不会教你怎么写代码,最下面我会将我的测试代码放在哪里,有需要的自提。
首先需要写一个简单的应用程序,需要包含功能:点击按钮界面显示图片;点击按钮开始播放音频;单击按钮打开文件读取文件中的全部内容显示在界面上。
我们需要实现如上的全部功能,下面是一些设置路径的代码:
-
图片路径
// 相对路径 //ui.label->setPixmap(QPixmap("./picture/1.jpg")); // 设置图像属性 // 绝对路径 ui.label->setPixmap(QPixmap("E:\\QTproject\\Text\\Text\\1.jpg")); // 设置图像属性
-
音频路径
// 相对路径 //player->setMedia(QUrl::fromLocalFile("./picture/徐梦圆 - China-X.mp3")); // 设置媒体流 // 绝对路径 player->setMedia(QUrl::fromLocalFile("E:\\QTproject\\Text\\Text\\徐梦圆 - China-X.mp3")); // 设置媒体流
-
文件路径
// 相对路径 //ui.label->setPixmap(QPixmap("./picture/1.jpg")); // 设置图像属性 // 绝对路径 QFile file("E:\\QTproject\\Text\\Text\\sql.txt");
注意:
上面图片、音频、文件路径中一共有两个路径,一个是相对路径,一个是绝对路径。
其中,绝对路径是给我们在代码中进行测试的,测试运行程序是否可以正常显示图片,正常播放音频,正常打开文件。当都是正常的,说明代码没有写错,路径也没有写错。
然后相对路径是我们打包程序后所需要使用到的路径,程序打包后,需要从相对路径进行读取素材,否则会出问题!
所以上面测试阶段先将相对路径代码注释掉;打包阶段就注释绝对路径代码,显示相对路径代码。
有人可能还搞不懂什么是相对路径,什么是绝对路径。
相对路径:在.exe文件为起始路径;例如:./ …/等
绝对路径:在初始地方为起始路径;例如:C:\abc\cba等
二、准备素材
在Release 或 Debug文件夹下,也就是相对路径里(根据自己的编译方式),我创建了一个picture文件夹,里面有两张图片、一首音频、一个.txt文件。
也在.h和.cpp文件路径下准备了同样的素材
三、打包
1. 绿色版
-
找到qt安装的bin目录,并复制
-
添加环境变量
-
按win键,找到Qt目录,找到qt再带的打包工具,根据自己的编译环境选择
打开后如下:
-
确保自己的.exe文件可以运行
-
切换至.exe路径下,并写上 windeployqt 空格 .exe文件
如下图
-
出现此字样说明以及打包成功
-
再次进入.exe路径下,就可以发现多了许多文件
-
双击运行测试
可以正常运行并显示,但是,图片,音频等这些只能在自己的电脑上显示,因为代码中我们用的是绝对路径,所以在别人的电脑上是无法运行的,不信看下面测试。 -
在虚拟机中进行测试
将整个Release文件夹都赋值到虚拟机下
打开双击.exe测试
怎么样都无法进行显示,即使里面picture文件夹里有素材,但是我们的代码不是使用它那里的路径,所以导致无法显示。 -
解决办法,代码中将路径改成相对路径,再一次编辑即可
编译后,我们将文件再一次复制到虚拟机中运行测试,发现可以正常显示图片、播放音频、打开文件等操作。
这种方式比较灵活,可以随便更改文件的内容,更改图片,显示不一样的图片,例如:
2. .exe版
网上下载打包工具 Enigma Virtual Box
下面有网盘下载连接
-
导入文件
-
可以更改打包好的.exe文件路径和名字
-
拖入全部文件
-
压缩文件
-
点击打包
-
拷贝到虚拟机中测试
测试可以正常显示,打包成功!
素材与打包软件
链接:https://pan.baidu.com/s/1I_EWi9SRw298VnUMz2Egxg
提取码:cppp
代码
.h文件:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Text.h"
#include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式
#pragma execution_character_set("utf-8") // qt支持显示中文
class Text : public QMainWindow {
Q_OBJECT
public:
Text(QWidget *parent = Q_NULLPTR);
~Text();
private slots:
void on_showBtn_clicked();
void on_playBtn_clicked();
void on_textSqlBtn_clicked();
private:
Ui::TextClass ui;
QMediaPlayer *player;
bool flag;
};
.cpp文件:
#include "Text.h"
#include <qmessagebox.h>
#include <qdebug.h>
#include <Qfile>
//#pragma execution_character_set("utf-8") // qt支持显示中文
Text::Text(QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
flag = false;
player = new QMediaPlayer;
// 相对路径
player->setMedia(QUrl::fromLocalFile("./picture/徐梦圆 - China-X.mp3")); // 设置媒体流
// 绝对路径
//player->setMedia(QUrl::fromLocalFile("E:\\QTproject\\Text\\Text\\徐梦圆 - China-X.mp3")); // 设置媒体流
// 指定当点击右上角叉时所做的操作
connect(this, &Text::destroyed, [=]() {
qDebug() << "程序退出..." << endl;
});
}
Text::~Text() {
}
// 显示与隐藏图片
bool text = false;
void Text::on_showBtn_clicked() {
// 相对路径
ui.label->setPixmap(QPixmap("./picture/1.jpg")); // 设置图像属性
// 绝对路径
//ui.label->setPixmap(QPixmap("E:\\QTproject\\Text\\Text\\1.jpg")); // 设置图像属性
ui.label->setScaledContents(true); // 缩放图片大小,使得图片大小正好填充label空间
if (!text) {
ui.label->show();
text = true;
} else {
ui.label->hide();
text = false;
}
}
// 播放与暂停音乐
void Text::on_playBtn_clicked() {
if (flag == false) {
this->player->play();
flag = true;
} else {
this->player->pause();
flag = false;
}
}
// 打开文件,读取文件内容,显示与隐藏
bool textSql = false;
void Text::on_textSqlBtn_clicked() {
// 相对路径
QFile file("./picture/sql.txt");
// 绝对路径
//QFile file("E:\\QTproject\\Text\\Text\\sql.txt");
QString text = "";
if (!file.exists()) {
text = QString("文件不存在!").toUtf8();
qDebug() << text;
return;
}
// 以纯文本与只读方式打开文件
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
text = QString("文件打开失败!").toUtf8();
qDebug() << text;
return;
}
//读取文件的全部内容
text = file.readAll();
ui.label_2->setText(text);
if (!textSql) {
ui.label_2->show();
textSql = true;
} else {
ui.label_2->hide();
textSql = false;
}
}
总结:
到此位置,程序已经打包完毕;只要按照图中步骤来操作,就不会出现问题,快分享给自己的小伙伴去吧!
注意:
一定要注意打包的程序需要使用相对路径。