因为我需要运行qt程序,所以需要安装一个具有qt环境的runtime,在此选择kde的runtime,版本为5.12,此运行时由flathub存储库提供。
命令为:
添加flathub存储库
Flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
安装runtime 和Sdk
flatpak install flathub org.kde.Platform//5.12 org.freedesktop.Sdk//5.12
此过程安装较慢。
安装之后可以在/var/lib/flatpak/runtime/ 下查看
也可以用
//查看所有已安装的runtime和Sdk
flatpak list --runtime
此例用了简单的qt的widget和pushbutton,代码在文章结尾。
代码目录如下:
Flatpak软件包是有flatpak-builder构建的,所以需要
apt-get install flatpak-builder flatpak
Flatpak-builder会读取清单档,清单档描述了应用的关键属性以及构建方法。
在当前目录新建一个org.ubuntukylin.hello_qt.json档
内容如下:
{
"app-id": "org.ubuntukylin.hello_qt",
"runtime": "org.kde.Platform",
"runtime-version": "5.12",
"sdk": "org.kde.Sdk",
"command": "hello_qt",
"finish-args":[
"--socket=x11"
],
"modules": [
{
"name": "hello_qt",
"no-autogen": true,
"sources": [
{
"type": "git",
"url": "https://github.com/whailiang/flatpak-hello-demo.git",
"branch":"master"
},
{
"type":"script",
"commands":[
"sed -i 's|/usr|/app|g' hello_qt.pro",
"qmake PREFIX=/app"
],
"dest-filename":"configure"
}
]
}
]
}
其中包括应用的基本信息:
app-id
app名字
Runtime
app所使用的runtime名字
Runtime-version
runtime版本
Sdk
与runtime匹配的Sdk
Command
应用的命令
Finish-args
应用的配置选项,使应用程序可以访问沙盒外的资源。
Modules:
这里描述了要作为构建过程中的每一个模块,其中一个模块始终是此应用程序。其他可以是应用程序的依赖库和应用程序捆绑在一起(自包含)。
模块可以有很多类型,包括tar.gz tar.xz的归档档 url 下载地址 ;目前可以理解为,这些都是依赖库的源码,url 为源码地址。
编译json文件
flatpak-builder --repo=kylin-repo hello org.ubuntukylin.hello_qt.json --force-clean
这个命令执行以下操作:
编译之后生成hello 目录 kylin-repo目录
其中hello目录 结构和此应用的沙盒环境中的目录结构是相同的。
Kylin-repo目录还需了解。
添加已创建的新存储库
flatpak --user remote-add --no-gpg-verify --if-not-exists kylin-repo kylin-repo
flatpak --user install kylin-repo org.ubuntukylin.hello_qt
其中–user 是将应用以用户级应用安装到沙盒环境中,
可以–system 就是以系统级应用将应用安装到沙盒环境中。
我们可以通过 flatpak list --app
查看系统中flatpak应用的安装情况
其中installation
列就是表明此应用是系统级应用还是用户级应用。
flatpak run org.ubuntukylin.hello_qt
flatpak run --devel --command=bash org.ubuntukylin.hello_qt
这会提供一个安装在/app中的应用程序软件包的环境,以及它构建的安装在/usr中的sdk。你可以探索这两个目录来查看一个典型的flatpak的外观,以及sdk中包含的内容。
flatpak build-bundle kylin-repo hello.flatpak org.ubuntukylin.hello_qt
其中kylin-repo
是应用安装到的存储库名字 hello.flatpak
是生成的flatpak文件名
org.ubuntukylin.hello_qt
是应用程序名
Flatpak档可以在其他机器上直接安装
flatpak install hello.flatpak
hello_qt.pro
#-------------------------------------------------
#
# Project created by QtCreator 2018-04-20T22:54:49
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = hello_qt
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += link_pkgconfig
CONFIG += c++11
#PKGCONFIG += dtkwidget
SOURCES += \
main.cpp \
dialog.cpp
HEADERS += \
dialog.h
FORMS += \
dialog.ui
isEmpty(PREFIX){
PREFIX = /usr
}
target.path = $${PREFIX}/bin/
INSTALLS += target
GitVersion = $$system(git rev-parse HEAD)
DEFINES += GIT_VERSION=\\\"$$GitVersion\\\"
main.cpp
#include "dialog.h"
#include
//#include
//DWIDGET_USE_NAMESPACE
int main(int argc, char *argv[])
{
// DApplication::loadDXcbPlugin();
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_btnAboutQt_clicked()
{
qApp->aboutQt();
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void on_btnAboutQt_clicked();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>116</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>125</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>Hello World</string>
</property>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>125</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>116</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="btnAboutQt">
<property name="text">
<string>About Qt</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>