如何在C4Droid中编译简单的Qt5.2项目 我想知道如何在C4DROID中构建和编译一个简单的QT项目,C+Delphi是一个Android的C++编译器。

如何在C4Droid中编译简单的Qt5.2项目 我想知道如何在C4DROID中构建和编译一个简单的QT项目,C+Delphi是一个Android的C++编译器。,android,c++,qt,Android,C++,Qt,该程序附带了两个简单的示例:一个“Hello world”标签(一个文件)和一个示例记事本。第二个看起来很有趣,但它处理的表单完全是从代码创建的 我正在调查是否可以对从.ui文件生成的表单执行此操作。我在QtCreator中为Qt4.8创建了一个简单的项目,编译了.ui表单,并将代码从Qt4.8改编为Qt5.2。项目本身非常简单:一个带有QButton和QLineEdit的表单。按下QButton时,QLineEdit中会显示“Hello world” 据我所知,C4Droid不解析.pro文件

该程序附带了两个简单的示例:一个“Hello world”标签(一个文件)和一个示例记事本。第二个看起来很有趣,但它处理的表单完全是从代码创建的

我正在调查是否可以对从.ui文件生成的表单执行此操作。我在QtCreator中为Qt4.8创建了一个简单的项目,编译了.ui表单,并将代码从Qt4.8改编为Qt5.2。项目本身非常简单:一个带有QButton和QLineEdit的表单。按下QButton时,QLineEdit中会显示“Hello world”

据我所知,C4Droid不解析.pro文件。要编译项目,我必须打开main.cpp并长按“编译”,选择“编译多个源代码文件(简单)”,然后运行。C4droid使用自己的“makefile”文件,即.C4droid文本文件

以下是我在C4droid测试文件夹中发布的文件:

ButtonHelloWorld.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ButtonHelloWorld
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ButtonHelloWorld
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
main.cpp:

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
ui_main window.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_ButtonSayHello_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QHeaderView>
#include <QLineEdit>
#include <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QVBoxLayout *verticalLayout;
    QPushButton *ButtonSayHello;
    QLineEdit *LeditSayHello;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(198, 103);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        verticalLayout = new QVBoxLayout(centralWidget);
        verticalLayout->setSpacing(6);
        verticalLayout->setContentsMargins(11, 11, 11, 11);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        ButtonSayHello = new QPushButton(centralWidget);
        ButtonSayHello->setObjectName(QString::fromUtf8("ButtonSayHello"));

        verticalLayout->addWidget(ButtonSayHello);

        LeditSayHello = new QLineEdit(centralWidget);
        LeditSayHello->setObjectName(QString::fromUtf8("LeditSayHello"));
        LeditSayHello->setAlignment(Qt::AlignCenter);

        verticalLayout->addWidget(LeditSayHello);

        MainWindow->setCentralWidget(centralWidget);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
        ButtonSayHello->setText(QApplication::translate("MainWindow", "Say Hello", 0));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_ButtonSayHello_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
然后,在C4droid中,我打开application.pro,长按“Compile”。挑选 “Makefile”编译模式和“Qt应用程序”运行模式,并放置 可执行文件“application.so”。它编译正常,但失败 “复制文件失败”

但如果我把“libapplication.so”作为可执行文件,它会编译 没问题

为什么

他:

因为在Android上,Qt可执行文件总是命名为libXXX.so

我:

嗯,我试过“libappli.so”,但也犯了同样的错误

但是,通过调查,我发现可执行文件名必须是 lib[NameOf.proFileWithoutExtension].so,它是文件夹名 独立的。现在你复制的例子和我的工作

而且,他告诉我,一旦编译完成,将其导出到一个.APK,就像菜单->导出一样简单。我试过了,而且。。。太神奇了

结论


解决了。回答我自己的问题是为了帮助其他处于同样处境的人。

您忘记处理元对象编译器,简称“moc”,用于主窗口的文件。否则,QObject机制将无法正常工作

您需要执行以下任一操作:

moc -o mainwindow.moc mainwindow.h
g++ ... mainwindow.moc
作为构建过程的一部分,即通过显式运行moc扩展Makefile,并将*.moc模式添加到要编译的文件列表中,或者单独运行编译器命令


或者,C4Droid似乎从3.49版开始就支持qmake项目文件。

这个答案可以看作是

在C4droid中编译和导出Qt项目的迷你教程。

如何在C4DROID中构建和编译一个简单的QT项目,C4DROID是一个Android的C++编译器? 我在QtCreator中为Qt4.8创建了一个简单的项目,编译了.ui表单,并将代码从Qt4.8改编为Qt5.2。项目本身非常简单:一个带有QButton和QLineEdit的表单。按下QButton时,QLineEdit中会显示“Hello world”

以下是我在C4droid测试文件夹中发布的文件:

ButtonHelloWorld.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ButtonHelloWorld
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ButtonHelloWorld
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
main.cpp:

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwindow.ui:

<?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>198</width>
    <height>103</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QPushButton" name="ButtonSayHello">
      <property name="text">
       <string>Say Hello</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QLineEdit" name="LeditSayHello">
      <property name="alignment">
       <set>Qt::AlignCenter</set>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

主窗口
0
0
198
103
主窗口
打招呼
Qt::AlignCenter
现在,从C4Droid打开ButtonHelloWorld.pro或main.cpp。长点击编译,选择“Makefile”编译模式和“Qt应用程序”运行模式,选择“libButtonHelloWorld.so”作为可执行文件

这一点很重要:在Android中,Qt可执行文件总是命名为libXXX.so可执行文件名必须是lib[NameOf.proFileWithoutExtension].so,并且它是独立的文件夹名

编译和测试后,它运行正常,将其导出到.APK非常简单,只需菜单->导出即可

我试过了,而且。。。太神奇了


PS:如果你想知道moc、qmake、rcc和uic可执行文件在哪里,它们在/data/data/com.n0n3m4.droidc/files/gcc/qt/bin/文件夹中(至少在我的android中是这样)。

因此,你必须通过运行“moc-o mainwindow.moc inputfile”来创建moc文件,然后像往常一样编译生成的moc文件,例如
g++。。。mainwindow.moc
。根据您的建议,我进入了Terminal,进入我的项目文件夹,键入:/data/data/com.n0n3m4.drodc/files/gcc/qt/bin/moc mainwindow.h-o mainwindow.h.moc。之后,我就没有机会编译了。我还应该做什么呢?我不知道什么是不走运,但就像我之前说的,你必须做两个步骤,你只做了一个。你读过我评论的这一部分吗<然后像往常一样编译生成的moc文件,例如g++。。。mainwindow.moc.我问过C4droid开发人员,他的回答是(刚才):“C4droid可以解析.pro文件,仔细看示例。Google Play上的描述是唯一可用的教程,但已经足够了。”我将再次回顾这两个教程(再一次)基本上已经有官方教程了。。。令人惊讶的是,你竟然没有把它联系起来我在谷歌上搜索了很多,但什么都没找到。Google Play中只有应用程序描述可用,但对我来说太简洁和不清楚了。告诉我你所指的链接,我会很乐意把它包括在我的帖子里。