- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试弄清楚如何在 C4Droid(一种适用于 Android 的 C++ 编译器)中构建和编译一个简单的 Qt 项目。
该程序带有 2 个简单示例:一个“Hello world”标签(一个文件)和一个记事本示例。第二个看起来很有趣,但它处理的是完全从代码创建的表单。
我正在研究是否可以使用从 .ui 文件生成的表单来执行此操作。我在 Qt Creator 中为 Qt 4.8 创建了一个简单的项目,编译了 .ui 表单,并将代码从 Qt 4.8 改编为 Qt 5.2。项目本身非常简单:一个带有 QButton 和 QLineEdit 的表单。当按下 QButton 时,“Hello world”出现在 QLineEdit 中。
据我所知,C4Droid 不解析 .pro 文件。要编译项目,我必须打开 main.cpp 并长按“编译”,选择“编译多个源代码文件(简单)”,然后运行。 C4droid 在 .c4droid 文本文件中使用它自己的“makefile”文件。
这些是我在我的 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
主要.cpp:
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
主窗口.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
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_ButtonSayHello_clicked()
{
ui->LeditSayHello->setText(tr("Hello world"));
}
ui_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
我把原来的mainwindow.ui放在这里供引用(c4droid不用):
<?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>
当我尝试从 C4droid 中的 main.cpp 编译这个项目时,输出是:
/storage/emulated/0/Bull/C4Droid/ButtonHelloWorld/main.cpp:0: Note: No relevant classes found. No output generated. /data/data/com.n0n3m4.droidc/files/gcc/tmpdir/ccyCC2RV.o: In function
MainWindow::MainWindow(QWidget*)': mainwindow.cpp:(.text+0xc4):
vtable for MainWindow' /data/data/com.n0n3m4.droidc/files/gcc/tmpdir/ccyCC2RV.o: In function
undefined reference toMainWindow::~MainWindow()': mainwindow.cpp:(.text+0x14c): undefined
vtable for MainWindow' /data/data/com.n0n3m4.droidc/files/gcc/tmpdir/ccyCC2RV.o: In function
reference toMainWindow::tr(char const*, char const*, int)':
MainWindow::staticMetaObject' collect2: error: ld returned 1 exit status
mainwindow.cpp:(.text._ZN10MainWindow2trEPKcS1_i[_ZN10MainWindow2trEPKcS1_i]+0x5c):
undefined reference to
我该怎么做才能成功编译这个项目?
当然,我在谷歌上搜索了很多,并尝试在所有地方都包含 .moc 文件,但没有成功。
(顺便说一下,我现在刚刚尝试创建标签“C4Droid”,但我没有足够的声誉来做到这一点:-/)
更新 1--- 仔细查看 C4droid 附带的多个文件 Qt 示例,我注意到它使用了 Makefile。阅读 Makefile,我注意到该文件是使用以下命令生成的:
/data/data/com.n0n3m4.droidc/files/gcc/qt/bin/qmake -spec android-g++ -o Makefile application.pro
(这也让我知道 moc、qmake、rcc 和 uic 可执行文件在我的 android 的/data/data/com.n0n3m4.droidc/files/gcc/qt/bin/文件夹中)
这应该根据文件 .pro 创建一个 Makefile,它会自动告诉系统在编译之前使用 uic、moc 等,并在编译之后进行正确的链接。所以我在我的 android 中输入终端并输入:
/data/data/com.n0n3m4.droidc/files/gcc/qt/bin/qmake -spec android-g++ -o Makefile ButtonHelloWorld.pro
我得到的是:
sh: arm-linux-androideabi-gcc: not found
更新 2
C4droid 开发者回复我:
"C4droid can parse .pro files, look at the examples carefully. The description on Google Play is the only tutorial available, but it is enough."
所以我决定转到 C4droid 中的 .pro 文件。看了示例编译选项后,我决定长按编译,选择“Makefile”编译模式和“Qt application”运行模式,“ButtonHelloWorld.qexe”作为可执行文件。
我现在编译,一切似乎都好得多,但最后弹出这条消息:
Failed to copy file
有什么提示吗?
更新 3
好的,我测试并使用了 bundle 的 Qt 应用程序示例(多次),我再次通过电子邮件发送给开发人员,现在它非常方便。
我:
I've decided to do a test with your example. I've copied to a new folder (/storage/emulated/0/Bull/C4Droid/application)
images folder
application.pro
application.qrc
main.cpp
mainwindow.cpp
mainwindow.hThen, in C4droid, I open application.pro, long-tap "Compile". Select "Makefile" compilation mode and "Qt application" run mode, and put an executable file "pplication.so". It compiles OK, but fails with "Failed to copy file".
But if I put "libapplication.so" as executable file, it compiles and finishes OK.
¿Why?
他:
Because on Android Qt executables are always named libXXX.so
我:
Well, I tried "libappli.so" and got same error.
But, Investigating this, I've seen that executable name must be lib[NameOf.proFileWithoutExtension].so, and it's folder-name independant. Now your copied example and mine work!!
而且,他还告诉我,编译后,将其导出为 .APK 非常简单,只需菜单 -> 导出即可。我试过了……太棒了!!
结论
已解决。回答我自己的问题以帮助处于相同情况的其他人。
最佳答案
这个答案可以看作是一个
在 C4droid 中编译和导出 Qt 项目的迷你教程。
如何在 C4Droid(Android 的 C++ 编译器)中构建和编译一个简单的 Qt 项目?
我在 Qt Creator 中为 Qt 4.8 创建了一个简单的项目,编译了 .ui 表单,并将代码从 Qt 4.8 改编为 Qt 5.2。项目本身非常简单:一个带有 QButton 和 QLineEdit 的表单。当按下 QButton 时,“Hello world”出现在 QLineEdit 中。
这些是我在我的 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
main.cpp :
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
主窗口.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
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_ButtonSayHello_clicked()
{
ui->LeditSayHello->setText(tr("Hello world"));
}
主窗口.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>
现在,从 C4Droid 打开 ButtonHelloWorld.pro 或 main.cpp。长按Compile,选择“Makefile”编译模式和“Qt application”运行模式,“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 中).
关于android - 如何在C4Droid中编译简单的Qt 5.2工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462719/
我正在使用 Qt 语言学家翻译一个 ui 文件。我使用 lupdate 获取了它的 ts 文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但我从它的教程中发现我似乎必须将 tr() 添加到
我想在 Qt Creator 中创建下面的简单控制台应用程序: #include int main(int argc, char* argv[]) { std::cout #include
我想将 libQtGui.so.4 libQtNetwork.so.4 和 libQtCore.so.4 包含在与我的应用程序所在的目录相同的目录中。我如何让 Qt 理解这一点? y 目的是拥有一个使
我有一个充满 QPushButtons 和 QLabels 以及各种其他有趣的 QWidget 的窗口,所有这些都使用各种 QLayout 对象动态布局...而我想做的是偶尔制作一些这些小部件变得不可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
我想知道 Qt 是否将下面代码的“版本 1”之类的东西放在堆上?在版本 1 中,Qt 会将 dirStuff 放在堆栈上还是堆上?我问是因为我有一种感觉,Java 将所有数据结构放在堆上......不
这个问题是关于 Qt Installer Framework 2.0 版的。 在这一点上,使用 Qt 安装程序框架的人都知道,如果不进行自定义,您根本无法通过安装程序覆盖现有安装。这样做显然是为了解决
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
因为我在我的计算机上安装了 Qt 4.8.4 和 Qt 5.1,所以我遇到了问题。 当只有 Qt 4.8.4 存在时,一切都很好。 当我添加 Qt 5.1 时,这个工作正常,但 Qt 4.8.4 给了
我无法在我的 Ubuntu 12 中安装更多软件包。我尝试了 apt-get install -f ,以及许多其他类似的技巧,但在找到解决方案方面没有进展。 这是属于 Qt 的损坏包: 以下包具有未满
我正在尝试使用 Virtual Box 中的 Ubuntu 机器复制我们目前在物理 Ubuntu 服务器上运行的应用程序。它是一个 QT 应用程序,但在服务器上我们使用 NPM 的 pm2 运行它。安
问题: Qt Creator 是用 Qt Creator 构建的吗? 同样,Qt Designer 是用 Qt Designer 构建的吗? 顺便说一句,为什么有两个 Qt IDE?他们是竞争对手吗?
当我使用 QWidget设计用户界面时,我总是对它的大小属性有点困惑。有size policy , geometry和 hintSize . 我只知道size policy之间的关系和 hintSiz
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我想知道是否有一种很好的方法可以让用户像 LabView 一样创建节点图(有限制)。 像这样的东西: 我见过http://www.pyqtgraph.org/ ,这似乎有类似的东西,我确实打算使用 P
在 Qt 中是否有一种跨平台的方式来获得用户喜欢的固定宽度和比例字体? 例如,在 cocoa 中,有 NSFont *proportional = [NSFont userFontOfSize:12.
我想使用 Qt 和 C++ 制作这样的交互式图表:http://jsxgraph.uni-bayreuth.de/wiki/index.php/Cubic_spline_interpolation 关
我正在编写一个嵌入式设备屏幕的模拟(其中包含主 QWidget 顶部的自定义小部件),虽然屏幕的原始尺寸是 800x600,但我希望能够按比例放大和缩小它拖动窗口的角。如果不使用网格布局和担架(不会向
在下面的示例中,我是否必须从堆中删除对象?如果是的话,怎么办? #include #include #include #include #include int main(int argc,
来自 Web 开发背景,我现在进入 QT 应用程序开发。 使用 QFonts 我已经看到我显然只有两个选择,在 QT 中定义字体大小;按像素大小或点大小。 在制作网页布局时,我习惯于以相对方式定义所有
我是一名优秀的程序员,十分优秀!