qt环境下的c++程序编写

课程讲到了面向对象程序设计(C++)
那就根据课程写一些笔记

C++与C

C++是在C的基础上扩展了面向对象的内容,所以C++完全兼容C

大学中使用的开发环境是qt 非常好用 能很方便的做出一些带ui的程序 这里会自学 并赛一些比较基础的实例上来

一、基础四则计算器

新建项目

先新建一个项目 文件-新建文件或项目-选择一个模板-Application-Qt Widgets Application-右下角确认选择
随后选择项目名称 具体目录 配置好编译文件 就可以开始编写了
1
可以看到系统会默认给我们添加main.cpp、文件名.cpp、 文件名.h和一个.pro项目文件,点击完成,即可创建出一个Qt桌面程序。

关于这些文件的具体作用我们先按下不表 来看看如何一步步打造自己的计算器吧

设计计算器ui

每个计算器程序都会有自己的ui(用户页面)——例如我接下来展示的 微软自带的计算器
2
在编写具体的代码之前 我们需要参考类似的布局 设计出差不多的页面
3
↑程序的最终效果图
双击左边项目栏中的ui文件 进入ui编辑的页面 可以看到左半边是各种常见的组件 比如按钮 文本框 勾选框之类的 只要在左边选择想要的组件 选中并拖拽到屏幕中央 便可以在你设计的程序里添加相应的内容
首先是 按钮 既然是计算器 那就肯定要有按钮
从左边拖出一个 push button 双击更改其上显示的文字 然后在右下角minimumsize和maximumsize处将按钮大小固定为40×40 再次选中该按钮 用 ctrl+c ctrl+v 来复制出一样的按钮 其中等于号可以进行微调 设置成90×40的大小
4
排列好大致的位置后 将所有按钮选中 点击上方的 栅格布局 按钮 就可以将这些按钮组合起来 调整位置更加方便
5
整个计算器上边的文字框名为组件 Line edit 导入方法同理
接下来为了方便代码的编写 我们要为每个按钮起一个对应的对象名 点击按钮后在右上角会自动显示 双击来改名
6
整个窗口的大小可以通过代码或者点击整个ui页面的背景 和调整按钮一样调整最大和最小尺寸
剩下有一部分可选的调整需要在cpp文件中定义
8

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setMaximumSize(220,340); //窗口最大尺寸
    this->setMinimumSize(220,340); //窗口最小尺寸
    this->setWindowTitle("计算器"); //决定窗口标题
    QFont f("微软雅黑",14); //设置字体与字号
    ui->MainLineEdit->setFont(f); //套用字体
    ui->EqualButton->setStyleSheet("background:pink"); //设置等于号背景为粉色
}

程序编写

页面已经设计完毕了 接下来我们需要一个程序来让每个按钮实现他应有的功能
首先 为了让每个按钮被点击时加入对应的字符 我们需要一个能够盛放对应字符的变量
回到编辑页面 在.h头文件里定义一个QString变量 expression 用它来记录整个过程
7
接下来 为了让每个按钮实现对应功能 再次回到设计页面 对相应的按钮右键单击-转到槽- 在跳出的窗口里点击clicked()-ok
会自动跳转到相应函数的定义中 编写一段对应代码即可

void MainWindow::on_TwoButton_clicked() //可能会根据程序和对象名有所不同
{
    expression += "[对应字符]"; //在expression中插入对应的字符
    ui->MainLineEdit->setText(expression); //让文本框中显示expression中的字符
}

依葫芦画瓢 把所有对应的按钮进行编写 清空 退格 等于 按钮则需要特殊的定义

//清空
void MainWindow::on_Clear_clicked()
{
    expression.clear();
    ui->MainLineEdit->clear();
}
//退格
void MainWindow::on_Backspace_clicked()
{
    expression.chop(1);
    ui->MainLineEdit->setText(expression);
}
//等于
void MainWindow::on_EqualButton_clicked() {
    if (expression.isEmpty()) {
        ui->MainLineEdit->setText("Error");
        return;
    }

    QStack<double> s_num;   // 改为double以支持浮点
    QStack<char> s_opt;

    QByteArray ba = expression.toUtf8();
    const char *opt = ba.constData();

    int i = 0;
    double tmp = 0;
    bool isNum = false;

    while (opt[i] != '\0' || !s_opt.empty()) {
        if (isdigit(opt[i])) {
            tmp = tmp * 10 + (opt[i] - '0');
            i++;
            isNum = true;
        } else if (opt[i] == '.' && isNum) {
            // 处理小数部分(需扩展逻辑)
            i++;
            double fraction = 0.1;
            while (isdigit(opt[i])) {
                tmp += (opt[i] - '0') * fraction;
                fraction *= 0.1;
                i++;
            }
        } else {
            if (isNum) {
                s_num.push(tmp);
                tmp = 0;
                isNum = false;
            }
            // 运算符处理逻辑
            if (s_opt.empty() || Priority(opt[i]) > Priority(s_opt.top()) ||
                (s_opt.top() == '(' && opt[i] != ')')) {
                if (opt[i] != '\0') {
                    s_opt.push(opt[i]);
                    i++;
                }
            } else {
                while (!s_opt.empty() &&
                      (Priority(opt[i]) <= Priority(s_opt.top()) || opt[i] == ')')) {
                    char ch = s_opt.pop();
                    if (ch == '(' && opt[i] == ')') {
                        i++;
                        break;
                    }
                    if (s_num.size() < 2) {
                        ui->MainLineEdit->setText("Error");
                        return;
                    }
                    double num2 = s_num.pop();
                    double num1 = s_num.pop();
                    switch (ch) {
                        case '+': s_num.push(num1 + num2); break;
                        case '-': s_num.push(num1 - num2); break;
                        case '*': s_num.push(num1 * num2); break;
                        case '/':
                            if (num2 == 0) {
                                ui->MainLineEdit->setText("Error: Div 0");
                                return;
                            }
                            s_num.push(num1 / num2);
                            break;
                    }
                }
            }
        }
    }

    if (isNum) s_num.push(tmp);  // 处理最后一个数字

    if (s_num.empty()) {
        ui->MainLineEdit->setText("Error");
    } else {
        ui->MainLineEdit->setText(QString::number(s_num.top()));
    }
}
int MainWindow::Priority(char ch) {
    switch(ch) {
        case '(':
            return 3;
        case '*':
        case '/':
            return 2;
        case '+':
        case '-':
            return 1;
        default:
            return 0;
    }
}

都设置完之后点击左下角的编译 就可以测试成功运行了

注:cmd环境下不会显示UTF-8 需要在main函数中预先输入system(“chcp 65001”);

结尾/引用

We are just another visitor in a transient world.