课程链接:1、QT开发概述_哔哩哔哩_bilibili 1-5
1 QT开发概述
Qt是一个跨平台的 C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要/
Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用, 越来越壮大。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
Qt 是应用程序开发的一站式解决方案,有了 Qt,你就可以高枕无忧了!Qt 本身包含的模块也日益丰富, 一直有新模块和第三方模块加入进来。
大部分应用程序都可以使用 Qt 实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。
1997年,Qt 被用来开发 Linux 桌面环境 KDE,大获成功,使 Qt 成为 Linux 环境下开发 C++ GUI 程序的事实标准。
下面的程序都使用 Qt 开发:WPS、YY语音、Skype、豆瓣电台、虾米音乐、淘宝助理、千牛、暴雪的战网客户端、VirtualBox、Opera、咪咕音乐、Google地图、Adobe Photoshop Album 等。
Linux 也是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。
Qt 虽然也支持手机操作系统,但是由于 Android 本身已经有 java和 Kotlin,iOS 本身已经有 Objective-C 和 Swift,所以 Qt 在移动端的市场份额几乎可以忽略。
总体来说,Qt 主要用于桌面程序开发和嵌入式开发。
IDE:Qt Creator
2 QT的编译
编写源码
需要先创建qmake文件夹,并在该文件夹中创建qmake.cpp文件
#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout> //水平布局
#include <QVBoxLayout> //垂直布局
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *infoLabel = new QLabel;
QLabel *openLabel = new QLabel;
QLineEdit *cmdLineEdit = new QLineEdit;
QPushButton *commitButton = new QPushButton;
QPushButton *cancelButton = new QPushButton;
QPushButton *browseButton = new QPushButton;
infoLabel->setText("input cmd:");
openLabel->setText("open");
commitButton->setText("commit");
cancelButton->setText("cancel");
browseButton->setText("browse");
QHBoxLayout *cmdLayout = new QHBoxLayout; //水平布局对象
cmdLayout->addWidget(openLabel);
cmdLayout->addWidget(cmdLineEdit);
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(commitButton);
buttonLayout->addWidget(cancelButton);
buttonLayout->addWidget(browseButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(infoLabel);
mainLayout->addLayout(cmdLayout);
mainLayout->addLayout(buttonLayout);
QWidget w;
w.setLayout(mainLayout);
w.show();
w.setWindowTitle("running");
return app.exec();
}
修改环境变量
打开Qt提供的命令行窗口,并更换地址为qmake文件夹
生成工程文件
输入命令行,会生成工程文件
qmake -project
如图所示
修改qmake.pro文件,增加QT += widgets gui 避免编译出错
输入qmake
qmake
再输入mingw32-make
mingw32-make
编译完成
在release文件中打开qmake.exe遇到报错:无法定位程序输入点_ZN10QArrayData10deallocateEPS_yy于动态链接库,解决方案如下:
运行效果:
3 QT Creator
Qt Creator 功能十分强大了,包含项目模板生成、代码编辑、UI 设计、QML 界面编辑、调试程序、上下文帮助等丰富功能,而且支持手机平板设备、嵌入式设备等程序的开发调试。本节通过一个简单例子展示 Qt Creator 的代码编辑和 UI 编辑功能。
使用教程参考:(18条消息) Qt Creator使用教程(简明版)_迷路羊羊的博客-CSDN博客_qtcreator教程
视频案例复现效果:
4 信号与槽
基于3中设计的效果,先实现确定button的逻辑功能。
右键单击确定button,选择转到槽,会自动生成槽函数,头文件中也会相应添加。代码如下:
void Widget::on_commitButton_clicked()
{
//获取lineEdit数据
QString program = ui->cmdLineEdit->toPlainText();
//创建Process对象
QProcess *myProcess = new QProcess(this);
myProcess->start(program);
}
效果如下:
增加取消功能的逻辑代码,如下:
void Widget::on_cancelButton_clicked()
{
this->close();
}
connect(ui->cancelButton,&QPushButton::clicked,this,&Widget::on_cancelButton_clicked);
增加浏览功能的逻辑代码,如下:
connect(ui->browseButton,&QPushButton::clicked,[this](){
QMessageBox::information(this,"信息","点击浏览");
});
}
效果如下:
5 实现四则运算器
绘制UI并更改组件命名
定义一个字符串,用来显示输入的数字
编写基础非运算Button槽函数
void Widget::on_oneButton_clicked()
{
expression += "1";
ui->mainLineEdit->setText(expression);
}
void Widget::on_twoButton_clicked()
{
expression += "2";
ui->mainLineEdit->setText(expression);
}
void Widget::on_threeButton_clicked()
{
expression += "3";
ui->mainLineEdit->setText(expression);
}
void Widget::on_fourButton_clicked()
{
expression += "4";
ui->mainLineEdit->setText(expression);
}
void Widget::on_fiveButton_clicked()
{
expression += "5";
ui->mainLineEdit->setText(expression);
}
void Widget::on_sixButton_clicked()
{
expression += "6";
ui->mainLineEdit->setText(expression);
}
void Widget::on_sevenButton_clicked()
{
expression += "7";
ui->mainLineEdit->setText(expression);
}
void Widget::on_eightButton_clicked()
{
expression += "8";
ui->mainLineEdit->setText(expression);
}
void Widget::on_nineButton_clicked()
{
expression += "9";
ui->mainLineEdit->setText(expression);
}
void Widget::on_zeroButton_clicked()
{
expression += "0";
ui->mainLineEdit->setText(expression);
}
void Widget::on_leftButton_clicked()
{
expression += "(";
ui->mainLineEdit->setText(expression);
}
void Widget::on_rightButton_clicked()
{
expression += ")";
ui->mainLineEdit->setText(expression);
}
void Widget::on_addButton_clicked()
{
expression += "+";
ui->mainLineEdit->setText(expression);
}
void Widget::on_subButton_clicked()
{
expression += "-";
ui->mainLineEdit->setText(expression);
}
void Widget::on_divButton_clicked()
{
expression += "/";
ui->mainLineEdit->setText(expression);
}
void Widget::on_mulButton_clicked()
{
expression += "*";
ui->mainLineEdit->setText(expression);
}
void Widget::on_delButton_clicked()
{
expression.chop(1);
ui->mainLineEdit->setText(expression);
}
编写运算代码
void Widget::on_equalButton_clicked()
{
QStack<int> s_num, s_opt;
char opt[128] = {0};
int i = 0, tmp = 0, num1, num2;
//把QString转换成char *
QByteArray ba;
ba.append(expression); //把QString转换成QByteArray
strcpy(opt, ba.data()); //data可以把QByteArray转换成const char *
while (opt[i] != '\0' || s_opt.empty() != true)
{
if (opt[i] >= '0' && opt[i] <= '9')
{
tmp = tmp * 10 + opt[i] - '0';
i++;
if (opt[i] < '0' || opt[i] > '9')
{
s_num.push(tmp);
tmp = 0;
}
}
else //操作符
{
if (s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
(s_opt.top() == '(' && opt[i] != ')'))
{
s_opt.push(opt[i]);
i++;
continue;
}
if (s_opt.top() == '(' && opt[i] == ')')
{
s_opt.pop();
i++;
continue;
}
if (Priority(opt[i]) <= Priority(s_opt.top()) || (opt[i] == ')' && s_opt.top() != '(') ||
(opt[i] == '\0' && s_opt.empty() != true))
{
char ch = s_opt.top();
s_opt.pop();
switch(ch)
{
case '+':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 + num2);
break;
case '-':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 - num2);
break;
case '*':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 * num2);
break;
case '/':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 / num2);
break;
}
}
}
}
ui->mainLineEdit->setText(QString::number(s_num.top()));
expression.clear();
}
运算优先级设置
int Widget::Priority(char ch)
{
switch(ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
编写窗口的基础样式设置
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setMaximumSize(200, 280);
this->setMinimumSize(200, 280);
this->setWindowTitle("阿阳牌计算器");
QFont f("仿宋", 14); //字体对象
ui->mainLineEdit->setFont(f);
//添加Delete按钮图标
QIcon con("C:\\Users\\11252\\Desktop\\QtOnline\\calculator\\back.PNG");
ui->delButton->setIcon(con);
//改变按钮背景色为红色
ui->equalButton->setStyleSheet("background:red");
}
效果