port for qt 5.5

This commit is contained in:
Andrei Yankovich 2018-06-02 15:55:53 +03:00
parent 1d8307ea7a
commit 7afefc4272
20 changed files with 743 additions and 33 deletions

View File

@ -1,37 +1,34 @@
name: qt-deployer name: qt-deployer
version: '1.0test1' version: '1.0test3'
summary: Deploy Qt Project summary: Deploy Qt Project
description: | description: |
Deploy Qt Projects. this application extract all depends library of executable and create launch script for your application. Deploy Qt Projects. this application extract all depends library of executable and create launch script for your application.
grade: stable # must be 'stable' to release into candidate/stable channels grade: stable # must be 'stable' to release into candidate/stable channels
confinement: classic # use 'strict' once you have the right plugs and slots confinement: strict # use 'strict' once you have the right plugs and slots
base: core18
icon: snap/gui/icon.png icon: snap/gui/icon.png
apps: apps:
qt-deployer: qt-deployer:
command: qt5-launch opt/qt-deployer/bin/qt-deployer command: bin/qt-deployer
# desktop: usr/share/applications/desc.desktop
plugs: [desktop, home, opengl, x11, wayland] plugs: [desktop, home, opengl, x11, dbus]
environment:
LD_LIBRARY_PATH: $SNAP/lib
QML_IMPORT_PATH: $SNAP/qml
QML2_IMPORT_PATH: $SNAP/qml
QT_PLUGIN_PATH: $SNAP/plugins
QT_QPA_PLATFORM_PLUGIN_PATH: $SNAP/plugins/platforms
parts: parts:
qt-deployer: qt-deployer:
plugin: qmake plugin: dump
source: source/ source: Release-QtDeployer
build-packages: source-type: local
- qtbase5-dev
- qtdeclarative5-dev
stage-packages:
# Here for the plugins-- they're not linked in automatically.
- libqt5gui5
- libqt5qml5
- libqt5quick5
- qml-module-qtquick2
- qml-module-qtquick-dialogs
- qml-module-qtquick-controls
- qml-module-qtgraphicaleffects
after: [qt5conf] # A wiki part

View File

@ -11,7 +11,7 @@ BuildManager::BuildManager(QObject *parent) : BaseClass(parent)
void BuildManager::buildLog(){ void BuildManager::buildLog(){
tempLog = pQMake.readAll(); tempLog = pQMake.readAll();
emit logChanged(); emit logChanged(tempLog);
} }
void BuildManager::buildFinihed(int error) { void BuildManager::buildFinihed(int error) {

View File

@ -28,7 +28,7 @@ public:
bool build(); bool build();
signals: signals:
void logChanged(); void logChanged(QString);
void finished(); void finished();
public slots: public slots:

71
source/CPP/buildpage.cpp Normal file
View File

@ -0,0 +1,71 @@
#include "buildpage.h"
#include "ui_buildpage.h"
#include <QFileDialog>
BuildPage::BuildPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::BuildPage)
{
ui->setupUi(this);
connect(ui->chooseProjectPath, &QPushButton::clicked, this, &BuildPage::chooseProjectDir);
connect(ui->chooseQtBuildButton, &QPushButton::clicked, this, &BuildPage::chooseQtDir);
connect(ui->build, &QPushButton::clicked, this, &BuildPage::buildClick);
connect(ui->pathQtBuild, &QLineEdit::textChanged, this, &BuildPage::chooseChanged);
connect(ui->projectPath, &QLineEdit::textChanged, this, &BuildPage::chooseChanged);
}
void BuildPage::log(QString log){
ui->consloleLog->appendPlainText(log);
}
void BuildPage::checkPathes(){
QString QtBuild = ui->pathQtBuild->text();
QString Project = ui->projectPath->text();
bool allGood = true;
if(!QFile::exists(QtBuild)){
allGood = false;
ui->pathQtBuild->setStyleSheet("QLineEdit { background-color: red }");
}else {
ui->pathQtBuild->setStyleSheet("QLineEdit { background-color: '#41cd71' }");
}
if(!QFile::exists(Project)){
allGood = false;
ui->projectPath->setStyleSheet("QLineEdit { background-color: red }");
}else {
ui->projectPath->setStyleSheet("QLineEdit { background-color: '#41cd71' }");
}
ui->build->setEnabled(allGood);
}
void BuildPage::chooseQtDir(){
QString _OutputFolder = QFileDialog::getExistingDirectory(this, (tr("Selectt QT Folder")), QDir::homePath());
ui->pathQtBuild->setText(_OutputFolder);
}
void BuildPage::chooseProjectDir(){
QString _OutputFolder = QFileDialog::getExistingDirectory(this, tr("Select project Folder"), QDir::currentPath());
ui->projectPath->setText(_OutputFolder);
}
void BuildPage::buildClick(){
emit build(ui->pathQtBuild->text(), ui->projectPath->text());
}
void BuildPage::chooseChanged(QString) {
checkPathes();
}
BuildPage::~BuildPage()
{
delete ui;
}

33
source/CPP/buildpage.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef BUILDPAGE_H
#define BUILDPAGE_H
#include <QWidget>
namespace Ui {
class BuildPage;
}
class BuildPage : public QWidget
{
Q_OBJECT
public:
explicit BuildPage(QWidget *parent = 0);
~BuildPage();
public slots:
void log(QString);
private:
Ui::BuildPage *ui;
void checkPathes();
private slots:
void chooseQtDir();
void chooseProjectDir();
void buildClick();
void chooseChanged(QString);
signals:
void build(QString qt, QString pro);
};
#endif // BUILDPAGE_H

103
source/CPP/buildpage.ui Normal file
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BuildPage</class>
<widget class="QWidget" name="BuildPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="qtBuildInfo">
<property name="text">
<string>Qt build:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="pathQtBuild"/>
</item>
<item>
<widget class="QPushButton" name="chooseQtBuildButton">
<property name="text">
<string>Chose</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="projectInfo">
<property name="text">
<string>Project Dir:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="projectPath"/>
</item>
<item>
<widget class="QPushButton" name="chooseProjectPath">
<property name="text">
<string>Chose</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPlainTextEdit" name="consloleLog">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="plainText">
<string/>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="build">
<property name="text">
<string>build</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

33
source/CPP/deploypage.cpp Normal file
View File

@ -0,0 +1,33 @@
#include "deploypage.h"
#include "ui_deploypage.h"
#include <QMessageBox>
DeployPage::DeployPage(CppManager * cpp, QWidget *parent) :
QWidget(parent),
ui(new Ui::DeployPage)
{
ui->setupUi(this);
m_cpp = cpp;
model = new ListModel();
ui->tableView->setModel(model);
connect(ui->checkBox, &QCheckBox::stateChanged, this, &DeployPage::checkChanged);
connect(ui->deoply, &QPushButton::clicked, this, &DeployPage::deployClicked);
}
void DeployPage::deployClicked(){
emit deploy(model->getSelectedList());
}
void DeployPage::buildFinished(){
model->setSource(m_cpp->cppLibraries());
}
void DeployPage::checkChanged(int e){
ui->checkBox->setEnabled(!e);
}
DeployPage::~DeployPage()
{
delete model;
delete ui;
}

37
source/CPP/deploypage.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef DEPLOYPAGE_H
#define DEPLOYPAGE_H
#include <QWidget>
#include "listmodel.h"
#include "mainmanager.h"
#include "cppmanager.h"
namespace Ui {
class DeployPage;
}
class DeployPage : public QWidget
{
Q_OBJECT
public:
explicit DeployPage(CppManager *cpp ,QWidget *parent = 0);
void buildFinished();
~DeployPage();
private:
CppManager *m_cpp;
Ui::DeployPage *ui;
ListModel *model;
private slots:
void deployClicked();
void checkChanged(int);
signals:
void deploy(QStringList);
};
#endif // DEPLOYPAGE_H

58
source/CPP/deploypage.ui Normal file
View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DeployPage</class>
<widget class="QWidget" name="DeployPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableView" name="tableView"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>select all</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="deoply">
<property name="text">
<string>Deploy</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

98
source/CPP/listmodel.cpp Normal file
View File

@ -0,0 +1,98 @@
#include "listmodel.h"
ListModel::ListModel(QObject *parent)
: QStandardItemModel(parent)
{
}
QVariant ListModel::headerData(int section, Qt::Orientation orientation, int) const
{
if(orientation == Qt::Vertical){
switch (section) {
case 0:
return tr("lib Path");
case 1:
return tr("is Deploy");
default:
return QVariant();
break;
}
}
return QVariant();
}
int ListModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return source.size();
}
QVariant ListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if(role == Qt::DisplayRole){
switch (index.column()) {
case 0: return source[index.row()].first;
case 1: return source[index.row()].second;
break;
default:
return QVariant();
}
}
return QStandardItemModel::data(index, role);
}
bool ListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(index.column() != 1){
return false;
}
if (data(index, role) != value) {
source[index.row()].second = value.toBool();
emit dataChanged(index, index, QVector<int>() << role);
return true;
}
return false;
}
Qt::ItemFlags ListModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
if (index.column() == 1){
return Qt::ItemIsSelectable;
}
return Qt::NoItemFlags; // FIXME: Implement me!
}
void ListModel::setSource(const QStringList &_source){
beginResetModel();
source.clear();
for(const QString &i : _source){
source.push_back(QPair<QString, bool>(i, false));
}
endResetModel();
}
QStringList ListModel::getSelectedList()const {
QStringList list;
for (const QPair<QString, bool> &p: source){
if(p.second){
list.push_back(p.first);
}
}
return list;
}

36
source/CPP/listmodel.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef LISTMODEL_H
#define LISTMODEL_H
#include <QStandardItemModel>
class ListModel : public QStandardItemModel
{
Q_OBJECT
public:
explicit ListModel(QObject *parent = nullptr);
// Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// Basic functionality:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
// Editable:
bool setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
void setSource(const QStringList &source);
QStringList getSelectedList() const;
private:
QList<QPair<QString, bool>> source;
};
#endif // LISTMODEL_H

View File

@ -32,6 +32,14 @@ void MainManager::buildFinished(){
m_cpp->start(getAllExecutables()); m_cpp->start(getAllExecutables());
} }
BuildManager* MainManager::getBuild(){
return m_bld;
}
CppManager* MainManager::getCpp(){
return m_cpp;
}
void MainManager::prepare(const QString &qtdir, const QString &projectdir) void MainManager::prepare(const QString &qtdir, const QString &projectdir)
{ {
QStringList list; QStringList list;
@ -46,6 +54,11 @@ void MainManager::prepare(const QString &qtdir, const QString &projectdir)
m_bld->build(); m_bld->build();
} }
void MainManager::deploy(const QStringList& list){
m_cpp->setCppLibraries(list);
start(false);
}
void MainManager::start(bool erase) void MainManager::start(bool erase)
{ {
setState(1); setState(1);

View File

@ -35,9 +35,13 @@ public:
int state() const; int state() const;
BuildManager* getBuild();
CppManager* getCpp();
public slots: public slots:
void prepare(const QString &qtdir, const QString &projectdir); void prepare(const QString &qtdir, const QString &projectdir);
void deploy(const QStringList& list);
void start(bool erase); void start(bool erase);
const QString& outDir() const; const QString& outDir() const;

11
source/QML/Theme.js Normal file
View File

@ -0,0 +1,11 @@
function accentColor() {
return "#41cd71";
}
function backgroundColor() {
return "#ffffff";
}
function baseHeight(){
return 30;
}

View File

@ -2,6 +2,10 @@ TEMPLATE = app
QT += qml quick QT += qml quick
lessThan(QT_MINOR_VERSION, 6){
QT += widgets
}
CONFIG += c++14 CONFIG += c++14
RESOURCES += qml.qrc RESOURCES += qml.qrc
@ -37,7 +41,11 @@ SOURCES += \
CPP/outputmanager.cpp \ CPP/outputmanager.cpp \
CPP/pluginmanager.cpp \ CPP/pluginmanager.cpp \
CPP/qmlmanager.cpp \ CPP/qmlmanager.cpp \
CPP/buildmanager.cpp CPP/buildmanager.cpp \
mainwindow.cpp \
CPP/buildpage.cpp \
CPP/deploypage.cpp \
CPP/listmodel.cpp
HEADERS += \ HEADERS += \
CPP/baseclass.h \ CPP/baseclass.h \
@ -46,7 +54,11 @@ HEADERS += \
CPP/outputmanager.h \ CPP/outputmanager.h \
CPP/pluginmanager.h \ CPP/pluginmanager.h \
CPP/qmlmanager.h \ CPP/qmlmanager.h \
CPP/buildmanager.h CPP/buildmanager.h \
mainwindow.h \
CPP/buildpage.h \
CPP/deploypage.h \
CPP/listmodel.h
TRANSLATIONS += \ TRANSLATIONS += \
languages/en.ts languages/en.ts
@ -54,3 +66,8 @@ TRANSLATIONS += \
VERSION = 1.0.0.0 VERSION = 1.0.0.0
TEMPLATE = app TEMPLATE = app
RC_ICONS = snap/icon.ico RC_ICONS = snap/icon.ico
FORMS += \
mainwindow.ui \
CPP/buildpage.ui \
CPP/deploypage.ui

View File

@ -1,6 +1,12 @@
#include <QGuiApplication> #if QT_VERSION > 0x050501
#include <QQmlApplicationEngine> #include <QGuiApplication>
#include <QQmlContext> #include <QQmlApplicationEngine>
#include <QQmlContext>
#else
#include <QApplication>
#include "mainwindow.h"
#endif
#include <QIcon> #include <QIcon>
#include <QTranslator> #include <QTranslator>
@ -12,7 +18,8 @@
#include "CPP/buildmanager.h" #include "CPP/buildmanager.h"
bool loadTr(QGuiApplication &app){
bool loadTr(QGuiApplication *app){
QTranslator translator; QTranslator translator;
QString defaultLocale = QLocale::system().name(); QString defaultLocale = QLocale::system().name();
@ -21,7 +28,7 @@ bool loadTr(QGuiApplication &app){
if(!translator.load(QString(":/languages/%0").arg(defaultLocale))){ if(!translator.load(QString(":/languages/%0").arg(defaultLocale))){
return false; return false;
} }
app.installTranslator(&translator); app->installTranslator(&translator);
return true; return true;
@ -29,9 +36,18 @@ bool loadTr(QGuiApplication &app){
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QGuiApplication app(argc, argv); QGuiApplication *app;;
app.setWindowIcon(QIcon("://icon"));
#if QT_VERSION > 0x050501
app = new QGuiApplication(argc, argv);
#else
app = new QApplication(argc, argv);
#endif
app->setWindowIcon(QIcon("://icon"));
loadTr(app); loadTr(app);
@ -44,6 +60,7 @@ int main(int argc, char *argv[])
MainManager M(&C, &Q, &O, &P, &B); MainManager M(&C, &Q, &O, &P, &B);
#if QT_VERSION > 0x050501
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
auto *R = engine.rootContext(); auto *R = engine.rootContext();
@ -58,6 +75,14 @@ int main(int argc, char *argv[])
engine.load(QUrl(QLatin1String("qrc:/QML/main.qml"))); engine.load(QUrl(QLatin1String("qrc:/QML/main.qml")));
if (engine.rootObjects().isEmpty()) return -1; if (engine.rootObjects().isEmpty()) return -1;
#else
MainWindow mainApp(&M);
mainApp.show();
#endif
int returnCode = app->exec();
delete app;
return returnCode;
return app.exec();
} }

43
source/mainwindow.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(MainManager * mainManager, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
_mainManager = mainManager;
ui->setupUi(this);
buidlpage = new BuildPage(this);
deployPage = new DeployPage(_mainManager->getCpp() ,this);
ui->stackedWidget->addWidget(buidlpage);
ui->stackedWidget->addWidget(deployPage);
ui->stackedWidget->setCurrentIndex(0);
connect(buidlpage, SIGNAL(build(QString,QString)), _mainManager, SLOT(prepare(QString,QString)));
connect(_mainManager->getBuild(), SIGNAL(logChanged(QString)), buidlpage, SLOT(log(QString)));
connect(_mainManager->getBuild(), SIGNAL(finished()), this, SLOT(buidlFinisfed()));
connect(_mainManager, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int)));
connect(deployPage,SIGNAL(deploy(QStringList)), _mainManager, SLOT(deploy(QStringList)));
}
void MainWindow::buidlFinisfed(){
ui->stackedWidget->setCurrentIndex(1);
deployPage->buildFinished();
}
void MainWindow::stateChanged(int state){
if(state == 2){
QMessageBox::information(this, tr("deploy finished"), tr("programm has been deply into release folder"));
}
}
MainWindow::~MainWindow()
{
delete ui;
}

34
source/mainwindow.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "CPP/mainmanager.h"
#include "CPP/buildpage.h"
#include "CPP/deploypage.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
MainManager *_mainManager;
BuildPage *buidlpage;
DeployPage *deployPage;
private slots:
void buidlFinisfed();
void stateChanged(int);
public:
explicit MainWindow(MainManager * mainManager, QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

96
source/mainwindow.ui Normal file
View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="windowIcon">
<iconset resource="qml.qrc">
<normaloff>:/qtquickcontrols2.conf</normaloff>:/qtquickcontrols2.conf</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QStackedWidget" name="stackedWidget"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menusettings">
<property name="title">
<string>file</string>
</property>
<addaction name="actionsettings"/>
<addaction name="actionexit"/>
</widget>
<widget class="QMenu" name="menuabout">
<property name="title">
<string>about</string>
</property>
<addaction name="actioncontact"/>
<addaction name="actionabout"/>
</widget>
<addaction name="menusettings"/>
<addaction name="menuabout"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actioncontact">
<property name="text">
<string>contact</string>
</property>
</action>
<action name="actionabout">
<property name="text">
<string>about</string>
</property>
</action>
<action name="actionsettings">
<property name="text">
<string>settings</string>
</property>
</action>
<action name="actionexit">
<property name="text">
<string>exit</string>
</property>
</action>
</widget>
<resources>
<include location="qml.qrc"/>
</resources>
<connections>
<connection>
<sender>actionexit</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>399</x>
<y>299</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -12,6 +12,7 @@
<file alias="icon">res/icon.png</file> <file alias="icon">res/icon.png</file>
<file>QML/Header.qml</file> <file>QML/Header.qml</file>
<file>QML/About.qml</file> <file>QML/About.qml</file>
<file>QML/Theme.js</file>
</qresource> </qresource>
<qresource prefix="/languages"> <qresource prefix="/languages">
<file alias="en">languages/en.qm</file> <file alias="en">languages/en.qm</file>