电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【野火i.MX6ULL ARM Linux开发板连载】QT环境搭建(二)
分 享
扫描二维码分享
【野火i.MX6ULL ARM Linux开发板连载】QT环境搭建(二)
i.MX6ULL
Qt
野火
瑟寒凌风
关注
发布时间: 2021-03-08
丨
阅读: 617
# 安装QT5 在qt官网下载qt安装包,拷贝到虚拟机中,qt官网地址如下 ```bash https://download.qt.io/new_archive/qt/5.11/5.11.3/ ``` 下载如图所示的qt安装包 ![](https://cf05.ickimg.com/bbsimages/202103/607215e5210bfc0ee423fd71044d5d38.jpg) 然后使用如下命令给下载的qt-opensource-linux-x64-5.11.3.run赋予权限: ```bash sudo chmod +x qt-opensource-linux-x64-5.11.3.run ``` 执行安装命令 ```bash ./qt-opensource-linux-x64-5.11.3.run ``` ![](https://cf05.ickimg.com/bbsimages/202103/efbc86ddf9021345499f65c727fa6178.jpg) 如果没有qt账户的话,就注册一个,反正这里是需要登录的. ![](https://cf05.ickimg.com/bbsimages/202103/26e1f5e86b2f2c524b870b7a296aca7c.jpg) 然后一直下一步,遇到下图如果不知道怎么选的话,可以全部选择,毕竟虚拟机嘛,提前留够了空间,多占点无所谓. ![](https://cf05.ickimg.com/bbsimages/202103/65c106ac5916a77884ed778cba6d386a.jpg) 安装中 ![](https://cf05.ickimg.com/bbsimages/202103/23030435a9e8d9ea9aed5ec5f5248a43.jpg) ![](https://cf05.ickimg.com/bbsimages/202103/66ea08cf42e47f9be185fdd51a9c02db.jpg) 这里就安装完成了,使用一个例子来运行一下qt: 在button.h中输入如下代码 ```cpp #ifndef BUTTON_H #define BUTTON_H #include
//! [0] class Button : public QToolButton { Q_OBJECT public: explicit Button(const QString &text, QWidget *parent = 0); QSize sizeHint() const override; }; //! [0] #endif 在calculator.h中输入如下代码 #ifndef CALCULATOR_H #define CALCULATOR_H #include
QT_BEGIN_NAMESPACE class QLineEdit; QT_END_NAMESPACE class Button; //! [0] class Calculator : public QWidget { Q_OBJECT public: Calculator(QWidget *parent = 0); private slots: void digitClicked(); void unaryOperatorClicked(); void additiveOperatorClicked(); void multiplicativeOperatorClicked(); void equalClicked(); void pointClicked(); void changeSignClicked(); void backspaceClicked(); void clear(); void clearAll(); void clearMemory(); void readMemory(); void setMemory(); void addToMemory(); //! [0] //! [1] private: //! [1] //! [2] Button *createButton(const QString &text, const char *member); void abortOperation(); bool calculate(double rightOperand, const QString &pendingOperator); //! [2] //! [3] double sumInMemory; //! [3] //! [4] double sumSoFar; //! [4] //! [5] double factorSoFar; //! [5] //! [6] QString pendingAdditiveOperator; //! [6] //! [7] QString pendingMultiplicativeOperator; //! [7] //! [8] bool waitingForOperand; //! [8] //! [9] QLineEdit *display; //! [9] //! [10] enum { NumDigitButtons = 10 }; Button *digitButtons[NumDigitButtons]; }; //! [10] #endif ``` 在button.cpp中输入如下代码 ```cpp #include
#include "button.h" //! [0] Button::Button(const QString &text, QWidget *parent) : QToolButton(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); setText(text); } //! [0] //! [1] QSize Button::sizeHint() const //! [1] //! [2] { QSize size = QToolButton::sizeHint(); size.rheight() += 20; size.rwidth() = qMax(size.width(), size.height()); return size; } //! [2] ``` 在calculator.cpp中输入如下代码 ```cpp #include
#include
#include "button.h" #include "calculator.h" //! [0] Calculator::Calculator(QWidget *parent) : QWidget(parent) { sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; //! [0] //! [1] display = new QLineEdit("0"); //! [1] //! [2] display->setReadOnly(true); display->setAlignment(Qt::AlignRight); display->setMaxLength(15); QFont font = display->font(); font.setPointSize(font.pointSize() + 8); display->setFont(font); //! [2] //! [4] for (int i = 0; i < NumDigitButtons; ++i) { digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked())); } Button *pointButton = createButton(tr("."), SLOT(pointClicked())); Button *changeSignButton = createButton(tr("\302\261"), SLOT(changeSignClicked())); Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked())); Button *clearButton = createButton(tr("Clear"), SLOT(clear())); Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll())); Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory())); Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory())); Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory())); Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory())); Button *divisionButton = createButton(tr("\303\267"), SLOT(multiplicativeOperatorClicked())); Button *timesButton = createButton(tr("\303\227"), SLOT(multiplicativeOperatorClicked())); Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked())); Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked())); Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked())); Button *powerButton = createButton(tr("x\302\262"), SLOT(unaryOperatorClicked())); Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked())); Button *equalButton = createButton(tr("="), SLOT(equalClicked())); //! [4] //! [5] QGridLayout *mainLayout = new QGridLayout; //! [5] //! [6] mainLayout->setSizeConstraint(QLayout::SetFixedSize); mainLayout->addWidget(display, 0, 0, 1, 6); mainLayout->addWidget(backspaceButton, 1, 0, 1, 2); mainLayout->addWidget(clearButton, 1, 2, 1, 2); mainLayout->addWidget(clearAllButton, 1, 4, 1, 2); mainLayout->addWidget(clearMemoryButton, 2, 0); mainLayout->addWidget(readMemoryButton, 3, 0); mainLayout->addWidget(setMemoryButton, 4, 0); mainLayout->addWidget(addToMemoryButton, 5, 0); for (int i = 1; i < NumDigitButtons; ++i) { int row = ((9 - i) / 3) + 2; int column = ((i - 1) % 3) + 1; mainLayout->addWidget(digitButtons[i], row, column); } mainLayout->addWidget(digitButtons[0], 5, 1); mainLayout->addWidget(pointButton, 5, 2); mainLayout->addWidget(changeSignButton, 5, 3); mainLayout->addWidget(divisionButton, 2, 4); mainLayout->addWidget(timesButton, 3, 4); mainLayout->addWidget(minusButton, 4, 4); mainLayout->addWidget(plusButton, 5, 4); mainLayout->addWidget(squareRootButton, 2, 5); mainLayout->addWidget(powerButton, 3, 5); mainLayout->addWidget(reciprocalButton, 4, 5); mainLayout->addWidget(equalButton, 5, 5); setLayout(mainLayout); setWindowTitle(tr("Calculator")); } //! [6] //! [7] void Calculator::digitClicked() { Button *clickedButton = qobject_cast
(sender()); int digitValue = clickedButton->text().toInt(); if (display->text() == "0" && digitValue == 0.0) return; if (waitingForOperand) { display->clear(); waitingForOperand = false; } display->setText(display->text() + QString::number(digitValue)); } //! [7] //! [8] void Calculator::unaryOperatorClicked() //! [8] //! [9] { Button *clickedButton = qobject_cast
(sender()); QString clickedOperator = clickedButton->text(); double operand = display->text().toDouble(); double result = 0.0; if (clickedOperator == tr("Sqrt")) { if (operand < 0.0) { abortOperation(); return; } result = std::sqrt(operand); } else if (clickedOperator == tr("x\302\262")) { result = std::pow(operand, 2.0); } else if (clickedOperator == tr("1/x")) { if (operand == 0.0) { abortOperation(); return; } result = 1.0 / operand; } display->setText(QString::number(result)); waitingForOperand = true; } //! [9] //! [10] void Calculator::additiveOperatorClicked() //! [10] //! [11] { Button *clickedButton = qobject_cast
(sender()); QString clickedOperator = clickedButton->text(); double operand = display->text().toDouble(); //! [11] //! [12] if (!pendingMultiplicativeOperator.isEmpty()) { //! [12] //! [13] if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } display->setText(QString::number(factorSoFar)); operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); } //! [13] //! [14] if (!pendingAdditiveOperator.isEmpty()) { //! [14] //! [15] if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } display->setText(QString::number(sumSoFar)); } else { sumSoFar = operand; } //! [15] //! [16] pendingAdditiveOperator = clickedOperator; //! [16] //! [17] waitingForOperand = true; } //! [17] //! [18] void Calculator::multiplicativeOperatorClicked() { Button *clickedButton = qobject_cast
(sender()); QString clickedOperator = clickedButton->text(); double operand = display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } display->setText(QString::number(factorSoFar)); } else { factorSoFar = operand; } pendingMultiplicativeOperator = clickedOperator; waitingForOperand = true; } //! [18] //! [20] void Calculator::equalClicked() { double operand = display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } pendingAdditiveOperator.clear(); } else { sumSoFar = operand; } display->setText(QString::number(sumSoFar)); sumSoFar = 0.0; waitingForOperand = true; } //! [20] //! [22] void Calculator::pointClicked() { if (waitingForOperand) display->setText("0"); if (!display->text().contains('.')) display->setText(display->text() + tr(".")); waitingForOperand = false; } //! [22] //! [24] void Calculator::changeSignClicked() { QString text = display->text(); double value = text.toDouble(); if (value > 0.0) { text.prepend(tr("-")); } else if (value < 0.0) { text.remove(0, 1); } display->setText(text); } //! [24] //! [26] void Calculator::backspaceClicked() { if (waitingForOperand) return; QString text = display->text(); text.chop(1); if (text.isEmpty()) { text = "0"; waitingForOperand = true; } display->setText(text); } //! [26] //! [28] void Calculator::clear() { if (waitingForOperand) return; display->setText("0"); waitingForOperand = true; } //! [28] //! [30] void Calculator::clearAll() { sumSoFar = 0.0; factorSoFar = 0.0; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); display->setText("0"); waitingForOperand = true; } //! [30] //! [32] void Calculator::clearMemory() { sumInMemory = 0.0; } void Calculator::readMemory() { display->setText(QString::number(sumInMemory)); waitingForOperand = true; } void Calculator::setMemory() { equalClicked(); sumInMemory = display->text().toDouble(); } void Calculator::addToMemory() { equalClicked(); sumInMemory += display->text().toDouble(); } //! [32] //! [34] Button *Calculator::createButton(const QString &text, const char *member) { Button *button = new Button(text); connect(button, SIGNAL(clicked()), this, member); return button; } //! [34] //! [36] void Calculator::abortOperation() { clearAll(); display->setText(tr("####")); } //! [36] //! [38] bool Calculator::calculate(double rightOperand, const QString &pendingOperator) { if (pendingOperator == tr("+")) { sumSoFar += rightOperand; } else if (pendingOperator == tr("-")) { sumSoFar -= rightOperand; } else if (pendingOperator == tr("\303\227")) { factorSoFar *= rightOperand; } else if (pendingOperator == tr("\303\267")) { if (rightOperand == 0.0) return false; factorSoFar /= rightOperand; } return true; } //! [38] 在main.cpp中输入如下代码 #include
#include "calculator.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Calculator calc; calc.show(); return app.ex
ec(); } ``` 然后编译运行,得到如下结果,这是一个计算器的界面 ![](https://cf05.ickimg.com/bbsimages/202103/8bb66c9425d23957f809c1b45351b395.jpg) # 配置QT交叉编译工具 点击工具,选项,如下图 ![](https://cf05.ickimg.com/bbsimages/202103/d401993698de282df94f3075fd7c9635.jpg) ![](https://cf05.ickimg.com/bbsimages/202103/24a8467bb71f1dcb3cfedb2361f1c65e.jpg) 选择编译器,GCC,C++如下图所示 ![](https://cf05.ickimg.com/bbsimages/202103/e024c88c30dc90a1a2d0bf3a79ae36bb.jpg) 按照如图所示选择g++编译器路径和修改名称,然后点击apply和ok ![](https://cf05.ickimg.com/bbsimages/202103/f6cb3a6bf1f7221d006fc013ee6ee6f1.jpg) 同样的操作,在编译器的GCC下面,选择C,如下图 ![](https://cf05.ickimg.com/bbsimages/202103/adbc1c1a10272fdf06c77b54853454bc.jpg) 添加gcc的路径,如图 ![](https://cf05.ickimg.com/bbsimages/202103/14f3cb37c1c0758eb6ea895b5df33373.jpg) 完成后结果如下图 ![](https://cf05.ickimg.com/bbsimages/202103/6585f43fec3fedeee17bac8ec051f850.jpg) 然后修改qt版本,选择如下图所示 ![](https://cf05.ickimg.com/bbsimages/202103/84e3ddbdc4aa851655658ed5c148675a.jpg) 通过添加按钮,找到qt安装目录下的qmake文件,路径如下图 ![](https://cf05.ickimg.com/bbsimages/202103/0f932ba37172286c03332d513e1a6e7f.jpg) 添加好了后,点击构件套件中的添加 ![](https://cf05.ickimg.com/bbsimages/202103/9991dc1a09ece8eec5cb85670ffc8c6c.jpg) 然后将新添加的设为默认 ![](https://cf05.ickimg.com/bbsimages/202103/8926a089d05ca0069d51b6ad743b5874.jpg) 然后还是用上面计算器那个程序来编译一下,生成一个开发板可以执行的文件如图 ![](https://cf05.ickimg.com/bbsimages/202103/99c2a42d4dea88bb58496f63cdcc90d8.jpg) 把这个执行文件放在开发板的如下路径 /home/debian/qt-app 一个简单运行该程序的方法:将该程序改名为App,然后重启开发板,可以看到曾经的计算器已经在开发板上运行了 ![](https://cf05.ickimg.com/bbsimages/202103/dfd90e8056604afd14833b466c124aaa.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
瑟寒凌风
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交