1、环境
1.1 系统(x86-64架构)
1.2 软件环境:
自己编译的qt5.15.2,QIFW4.5,linuxdeployqtx86-64;
2、过程
2.1 linudeployqt
把这个程序赋予可执行权限,再放到自己的bin目录
cp ./linuxdeployqt-6-x86_64.AppImage /usr/local/bin/linuxdeployqt
测试是否可用
linuxdeployqt --version
2.2 把生成的release程序放到一个空文件夹下面,执行:linuxdeployqt Release -appimage
如果最后只是桌面文件报错,那就是可用了,我们也用不到,后面自己写一个,完成后输出
双击OfflineSerial可以测试是否可以运行,可以运行那就没多大问题。
问题1:没有字体,把你用到的字体放到这个目录/lib/fonts/ ,我只用到了宋体,所以只放了一个宋体,如图
问题2:文本编辑框只能输入英文,无法切换输入法
把这个文件放入刚生成的plugins的这个目录下,并且赋予执行权限
2.3 QIFW下载x86-64的直接运行就可以
后面这个工具使用和windows没有区别,就是需要自己生成个桌面快捷方式。我还有个本地服务,所以自己写了service,下面是我的QS文件,隐藏了两个界面和一个界面中的控件,只做参考,目前还是有点瑕疵。
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the FOO module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
function Component()
{
// default constructor
// hide some pages
installer.setDefaultPageVisible(QInstaller.LicenseCheck, false);
if (installer.isInstaller()) {
if (systemInfo.productType === "windows")
{
installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
}
}
// hide ComponentSelection page SearchLineEdit
var ComponentSelectionPage = gui.pageWidgetByObjectName("ComponentSelectionPage");
if(ComponentSelectionPage != null)
{
var lineedit1 = gui.findChild(ComponentSelectionPage, "SearchLineEdit");
if(lineedit1 != null)
lineedit1.setVisible(false);
}
}
function operationForLinux()
{
var params = "Name=OfflineSerial" + "\n";
params += "Icon=@TargetDir@/logo.ico" + "\n";
params += "Version=@Version@" + "\n";
params += "Exec=@TargetDir@/OfflineSerial" + "\n";
params += "Terminal=false" + "\n";
params += "Encoding=UTF-8" + "\n";
params += "Type=Application" + "\n";
params += "Categories=System" + "\n";
var desktop = "OfflineSerial.desktop";
component.addElevatedOperation("CreateDesktopEntry", "@TargetDir@/OfflineSerial.desktop", params);
var homeDir = installer.environmentVariable("HOME");
if(homeDir.length > 0)
{
component.addOperation("Copy", "@TargetDir@/OfflineSerial.desktop", homeDir + "/桌面/OfflineSerial.desktop");
}
}
Component.prototype.createOperations = function()
{
// call default implementation to actually install README.txt!
component.createOperations();
if (systemInfo.productType === "windows") {
//component.addOperation("CreateShortcut", "@TargetDir@/OfflineSerial.exe", "@StartMenuDir@/OfflineSerial.lnk",
// "workingDirectory=@TargetDir@", "iconPath=%SystemRoot%/system32/SHELL32.dll","iconId=1",
// "description=OfflineSerial");
component.addOperation("CreateShortcut", "@TargetDir@/OfflineSerial.exe", "@DesktopDir@/OfflineSerial.lnk",
"workingDirectory=@TargetDir@", "iconPath=@TargetDir@/logo.ico",
"description=OfflineSerial");
// regest windows service
component.addElevatedOperation("Execute", "sc.exe","create","SerialPortServer","start=","auto","binPath=",
"\"@TargetDir@/OfflineSerialServer.exe\" \"@TargetDir@/serialportservice.conf\"",
"UNDOEXECUTE","sc.exe","delete","SerialPortServer");
component.addElevatedOperation("Execute", "sc.exe","start","SerialPortServer",
"UNDOEXECUTE","sc.exe","stop","SerialPortServer");
}
else
{
// make desktop
operationForLinux();
// install service
var params = "[Unit]\n";
params += "Description=****** service\n";
params += "[Service]\n";
params += "Type=forking\n";
params += "ExecStart=@TargetDir@/OfflineSerialServer @TargetDir@\n";
params += "[Install]\n";
params += "WantedBy=OfflineSerialServer.target";
component.addOperation("PrependFile","@TargetDir@/OfflineSerialServer.service",params);
component.addOperation("Replace","@TargetDir@/serialportservice.conf","BACKPATH","@TargetDir@/back","string");
component.addElevatedOperation("Execute","@TargetDir@/OfflineSerialServer","-i", "UNDOEXECUTE","@TargetDir@/OfflineSerialServer","-u");
component.addElevatedOperation("Copy","@TargetDir@/OfflineSerialServer.service","/lib/systemd/system/OfflineSerialServer.service");
component.addElevatedOperation("Execute","systemctl","daemon-reload","UNDOEXECUTE", "systemctl","daemon-reload");
component.addElevatedOperation("Execute","systemctl","enable","OfflineSerialServer.service");
component.addElevatedOperation("Execute","systemctl","start","OfflineSerialServer.service" ,"UNDOEXECUTE","systemctl","stop","OfflineSerialServer.service" );
}
}
[个人备忘]