当前位置: 首页 > news >正文

【C++实战(66)】从0到1:C++图形化编程实战之Qt基础入门

目录

  • 一、Qt 的基础概念与环境搭建
    • 1.1 Qt 的特点
    • 1.2 Qt 开发环境搭建
    • 1.3 Qt 的核心模块与作用
  • 二、Qt Widgets 控件实战
    • 2.1 基础控件的使用
    • 2.2 布局管理器的应用
    • 2.3 信号与槽机制的实战
  • 三、Qt 界面交互与数据处理
    • 3.1 对话框的创建与使用
    • 3.2 文件操作与界面数据同步
    • 3.3 定时器与界面动态更新
  • 四、实战项目:简易计算器(Qt 版)
    • 4.1 项目需求
    • 4.2 控件布局与信号槽连接实现交互逻辑
    • 4.3 界面美化与功能测试


一、Qt 的基础概念与环境搭建

1.1 Qt 的特点

Qt 是一个跨平台的 C++ 应用程序开发框架,具有以下显著特点:

  • 跨平台性:Qt 能够在 Windows、Linux、macOS 等桌面操作系统,以及 Android、iOS 等移动操作系统上运行,开发者只需编写一次代码,就可以在不同平台上部署,大大提高了开发效率。以一款跨平台的办公软件为例,使用 Qt 开发,无论是在 Windows 系统的电脑上,还是在 macOS 系统的电脑上,都能正常运行且界面和功能保持一致 ,这为用户提供了统一的使用体验,也减少了开发者针对不同平台重复开发的工作量。
  • 面向对象:Qt 完全基于 C++ 的面向对象特性进行设计,拥有丰富的类库,开发者可以通过继承、封装、多态等特性,方便地进行代码的组织和扩展。例如,自定义一个按钮类,继承自 Qt 的 QPushButton 类,然后重写其点击事件处理函数,就可以实现具有特定功能的按钮,这使得代码结构更加清晰,可维护性和可扩展性更强。
  • 丰富的控件库:Qt 提供了大量的 UI 控件,如按钮(QPushButton)、标签(QLabel)、文本框(QLineEdit)、下拉框(QComboBox)等,这些控件风格在不同平台上保持一致,同时还支持自定义外观和行为。在开发一个图形界面的文件管理工具时,可以使用 Qt 的控件库快速搭建出包含文件列表显示、文件操作按钮、路径显示标签等元素的界面,无需从头开始编写这些基础控件的实现代码,大大缩短了开发周期。与其他一些 GUI 框架相比,Qt 的控件库更加丰富和完善,能够满足各种不同类型应用程序的界面开发需求。

1.2 Qt 开发环境搭建

  • Qt Creator 安装:首先,前往 Qt 官方网站(https://www.qt.io/download)下载适用于您操作系统的 Qt 安装包。下载完成后,双击安装包进行安装。在安装过程中,按照向导提示进行操作,例如选择安装路径、接受许可协议等。安装程序会提供组件选择界面,建议至少选择 Qt Creator 以及您需要使用的 Qt 版本和相关工具。例如,如果您主要开发桌面应用程序,可选择 Qt 5.x 版本,并勾选对应的开发工具和库。安装完成后,您可以在开始菜单(Windows 系统)或应用程序文件夹(macOS 系统)中找到 Qt Creator 的启动图标。
  • 编译器配置:Qt Creator 支持多种编译器,如 MinGW(GCC 编译器的 Windows 版本)、MSVC(Visual Studio 的编译器)等。如果您选择使用 MinGW 编译器,在安装 Qt 时,它可能会被默认安装。若使用 MSVC 编译器,则需要先安装 Visual Studio,然后在 Qt Creator 中进行配置。具体配置步骤为:打开 Qt Creator,进入 “工具”->“选项” 菜单,在左侧列表中选择 “构建套件(Kit)”,点击 “添加” 按钮,选择对应的编译器(如 MSVC 的版本)和调试器,然后指定 Qt 的安装路径(包含 bin、include、lib 等文件夹的路径)。例如,如果您安装的是 Visual Studio 2019,且使用的是 MSVC 14.2 版本的编译器,在配置时需准确选择对应的版本和相关路径。
  • 项目创建:打开 Qt Creator 后,点击 “文件”->“新建文件或项目”,在弹出的对话框中,选择 “应用程序” 下的 “Qt Widgets 应用”(用于创建传统的基于窗口小部件的应用程序),然后点击 “选择”。接下来,为项目命名并选择保存路径,点击 “下一步”。在 “构建套件选择” 页面,可以选择之前配置好的编译器和构建套件,点击 “下一步”。最后,选择项目所需的模块(如 Qt Core、Qt Widgets 等,通常保持默认即可),点击 “完成”。此时,Qt Creator 会生成一个基本的项目框架,包含源文件(.cpp)、头文件(.h)和项目文件(.pro),您可以在这个基础上开始编写代码。

1.3 Qt 的核心模块与作用

Qt 包含多个核心模块,以下是几个重要模块及其作用:

  • Qt Widgets:这是 Qt 用于创建传统桌面应用程序用户界面的模块,提供了各种基本的 UI 控件,如按钮、文本框、标签、列表框等,以及布局管理器(如 QVBoxLayout、QHBoxLayout、QGridLayout 等),用于管理这些控件在窗口中的布局。在开发一个文本编辑器应用时,通过 Qt Widgets 模块,可以创建用于显示文本内容的 QTextEdit 控件,用于打开、保存文件的 QPushButton 控件,以及用于显示文件路径的 QLabel 控件等,并使用布局管理器将这些控件合理地排列在窗口中。
  • Qt Core:是 Qt 的核心基础模块,提供了非 GUI 相关的基本功能,包括但不限于文件操作(QFile)、时间日期处理(QDateTime、QDate、QTime)、线程(QThread)、定时器(QTimer)、事件处理、信号与槽机制等。在一个多线程的网络爬虫程序中,利用 Qt Core 模块的 QThread 类创建线程来执行网页抓取任务,使用 QTimer 实现定时抓取功能,通过信号与槽机制在主线程和子线程之间传递数据和状态信息,利用 QFile 将抓取到的数据保存到本地文件。
  • Qt GUI:主要负责图形处理和显示相关的功能,包括 2D 绘图(QPainter)、字体管理(QFont)、图像处理(QPixmap、QImage)、颜色管理(QColor)、图标管理(QIcon)等。例如,在开发一个图片浏览应用时,使用 Qt GUI 模块的 QPixmap 类加载和显示图片,利用 QPainter 类在图片上绘制标注信息,通过 QFont 类设置标注文字的字体样式,使用 QColor 类设置绘制颜色和图片的滤镜效果。

这些核心模块相互协作,为开发者提供了全面而强大的功能,使得使用 Qt 开发各种类型的应用程序变得高效且便捷。

二、Qt Widgets 控件实战

2.1 基础控件的使用

  • QPushButton:用于创建一个可点击的按钮。以下是创建一个简单按钮并连接其点击事件的示例代码:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>// 按钮点击时的槽函数
void onButtonClicked() {qDebug() << "按钮被点击了";
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QPushButton *button = new QPushButton("点击我", &window);// 连接按钮的clicked信号到onButtonClicked槽函数QObject::connect(button, &QPushButton::clicked, onButtonClicked);layout.addWidget(button);window.show();return app.exec();
}
  • QLabel:主要用于显示文本或图像。以下示例展示了如何显示不同格式的文本和图片:
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QPixmap>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);// 显示纯文本QLabel *plainTextLabel = new QLabel("这是纯文本", &window);layout.addWidget(plainTextLabel);// 显示富文本(支持HTML标签)QLabel *richTextLabel = new QLabel("<b>这是加粗的富文本</b>", &window);layout.addWidget(richTextLabel);// 显示图片QLabel *imageLabel = new QLabel(&window);QPixmap pixmap(":/icon.png"); // 假设资源文件中包含名为icon.png的图片imageLabel->setPixmap(pixmap);layout.addWidget(imageLabel);window.show();return app.exec();
}
  • QLineEdit:是一个单行文本输入框,常用于接收用户输入。以下是一个获取用户输入并验证的示例:
#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QRegularExpression>// 验证输入的槽函数
void validateInput(const QString &input) {QRegularExpression regExp("^[0-9]+$"); // 匹配数字if (!regExp.match(input).hasMatch()) {qDebug() << "输入无效,请输入数字";} else {qDebug() << "输入有效:" << input;}
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QLineEdit *lineEdit = new QLineEdit(&window);layout.addWidget(lineEdit);QPushButton *button = new QPushButton("验证输入", &window);// 连接按钮点击信号到validateInput槽函数,并传递QLineEdit的文本QObject::connect(button, &QPushButton::clicked, [lineEdit]() {validateInput(lineEdit->text());});layout.addWidget(button);window.show();return app.exec();
}
  • QComboBox:提供一个下拉选择框。以下示例展示了如何添加选项以及监听选项变化:
#include <QApplication>
#include <QWidget>
#include <QComboBox>
#include <QVBoxLayout>
#include <QDebug>// 选项变化时的槽函数
void onComboBoxChanged(int index) {QComboBox *comboBox = qobject_cast<QComboBox*>(sender());if (comboBox) {qDebug() << "当前选择的是:" << comboBox->itemText(index);}
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QComboBox *comboBox = new QComboBox(&window);comboBox->addItem("选项1");comboBox->addItem("选项2");comboBox->addItem("选项3");layout.addWidget(comboBox);// 连接currentIndexChanged信号到onComboBoxChanged槽函数QObject::connect(comboBox, &QComboBox::currentIndexChanged, onComboBoxChanged);window.show();return app.exec();
}

2.2 布局管理器的应用

  • QVBoxLayout:垂直布局管理器,将控件垂直排列。常用于创建一列控件的布局,如在一个对话框中从上到下排列多个按钮和文本框。示例代码如下:
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);QLabel *label1 = new QLabel("标签1", &window);QLabel *label2 = new QLabel("标签2", &window);QPushButton *button = new QPushButton("按钮", &window);layout->addWidget(label1);layout->addWidget(label2);layout->addWidget(button);window.show();return app.exec();
}
  • QHBoxLayout:水平布局管理器,将控件水平排列。适用于创建一行控件的布局,比如在窗口顶部水平排列菜单按钮。示例如下:
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QHBoxLayout *layout = new QHBoxLayout(&window);QPushButton *button1 = new QPushButton("按钮1", &window);QPushButton *button2 = new QPushButton("按钮2", &window);QPushButton *button3 = new QPushButton("按钮3", &window);layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);window.show();return app.exec();
}
  • QGridLayout:网格布局管理器,将控件按网格形式排列。常用于创建表格形式的布局,例如计算器的数字按钮布局。示例代码:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QGridLayout>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QGridLayout *layout = new QGridLayout(&window);QStringList buttons = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"};int row = 0, col = 0;for (const QString &buttonText : buttons) {QPushButton *button = new QPushButton(buttonText, &window);layout->addWidget(button, row, col);col++;if (col > 3) {col = 0;row++;}}window.show();return app.exec();
}

2.3 信号与槽机制的实战

  • SIGNAL/SLOT 连接方式:在 Qt 4 及以前版本常用的连接方式,通过 SIGNAL 和 SLOT 宏来指定信号和槽。例如,连接按钮的点击信号到一个槽函数:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>// 按钮点击时的槽函数
void onButtonClicked() {qDebug() << "按钮被点击(SIGNAL/SLOT方式)";
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QPushButton *button = new QPushButton("点击我(SIGNAL/SLOT)", &window);// 使用SIGNAL和SLOT宏连接信号与槽QObject::connect(button, SIGNAL(clicked()), &window, SLOT(onButtonClicked()));layout.addWidget(button);window.show();return app.exec();
}
  • Lambda 表达式连接:在 Qt 5 及以后版本支持使用 Lambda 表达式连接信号与槽,使代码更加简洁和直观。例如:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QPushButton *button = new QPushButton("点击我(Lambda)", &window);// 使用Lambda表达式连接信号与槽QObject::connect(button, &QPushButton::clicked, [&]() {qDebug() << "按钮被点击(Lambda方式)";});layout.addWidget(button);window.show();return app.exec();
}

在实际应用中,信号与槽机制使得对象之间的通信变得简单和灵活。比如在一个图形界面的文件管理程序中,当用户点击 “打开文件” 按钮(按钮的 clicked 信号)时,通过信号与槽机制可以连接到一个用于打开文件对话框并处理文件读取的槽函数;当文件读取完成后,读取文件的对象又可以发出一个信号,通知界面更新显示文件内容等。

三、Qt 界面交互与数据处理

3.1 对话框的创建与使用

在 Qt 中,对话框是与用户进行交互的重要手段,QDialog 和 QMessageBox 是常用的对话框类。

  • QDialog:是所有对话框的基类,可用于创建自定义对话框。以下是创建一个简单自定义对话框的示例:
// CustomDialog.h
#ifndef CUSTOMDIALOG_H
#define CUSTOMDIALOG_H#include <QDialog>class CustomDialog : public QDialog
{Q_OBJECT
public:explicit CustomDialog(QWidget *parent = nullptr);private slots:void onAcceptButtonClicked();void onRejectButtonClicked();private:// 假设这里有一些UI元素QPushButton *acceptButton;QPushButton *rejectButton;
};#endif // CUSTOMDIALOG_H// CustomDialog.cpp
#include "CustomDialog.h"
#include <QVBoxLayout>
#include <QPushButton>CustomDialog::CustomDialog(QWidget *parent) : QDialog(parent)
{QVBoxLayout *layout = new QVBoxLayout(this);acceptButton = new QPushButton("接受", this);rejectButton = new QPushButton("拒绝", this);layout->addWidget(acceptButton);layout->addWidget(rejectButton);connect(acceptButton, &QPushButton::clicked, this, &CustomDialog::onAcceptButtonClicked);connect(rejectButton, &QPushButton::clicked, this, &CustomDialog::onRejectButtonClicked);
}void CustomDialog::onAcceptButtonClicked()
{// 处理接受操作,比如验证输入、关闭对话框等accept(); // 关闭对话框并返回QDialog::Accepted
}void CustomDialog::onRejectButtonClicked()
{// 处理拒绝操作,比如关闭对话框不保存等reject(); // 关闭对话框并返回QDialog::Rejected
}

在主程序中使用该自定义对话框:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include "CustomDialog.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QPushButton *openDialogButton = new QPushButton("打开自定义对话框", &window);layout.addWidget(openDialogButton);connect(openDialogButton, &QPushButton::clicked, [&]() {CustomDialog dialog(&window);if (dialog.exec() == QDialog::Accepted) {qDebug() << "用户点击了接受";} else {qDebug() << "用户点击了拒绝";}});window.show();return app.exec();
}
  • QMessageBox:用于显示简单的消息框,如信息、警告、错误和询问等。示例如下:
#include <QApplication>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 显示信息消息框QMessageBox::information(nullptr, "信息", "这是一条信息");// 显示警告消息框QMessageBox::warning(nullptr, "警告", "这是一条警告");// 显示错误消息框QMessageBox::critical(nullptr, "错误", "这是一条错误信息");// 显示询问消息框并获取用户选择int ret = QMessageBox::question(nullptr, "询问", "你是否要继续?", QMessageBox::Yes | QMessageBox::No);if (ret == QMessageBox::Yes) {QMessageBox::information(nullptr, "结果", "你选择了是");} else {QMessageBox::information(nullptr, "结果", "你选择了否");}return app.exec();
}

3.2 文件操作与界面数据同步

在 Qt 中,QFile 和 QTextStream 是常用的文件操作类,用于实现文件的读写以及与界面数据的同步。

  • QFile:提供了基本的文件操作功能,如打开、关闭、读取和写入文件。例如,读取一个文本文件的内容:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString fileName = "example.txt";QFile file(fileName);if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QByteArray fileData = file.readAll();file.close();qDebug() << "读取的文件内容:" << fileData;} else {qDebug() << "打开文件失败!";}return a.exec();
}
  • QTextStream:用于以文本流的方式读写文件,提供了更方便的文本处理功能,如格式化输出、按行读取等。以下是使用 QTextStream 写入文件的示例:
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString fileName = "output.txt";QFile file(fileName);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);out << "这是第一行文本" << endl;out << "这是第二行文本" << endl;file.close();} else {qDebug() << "打开文件失败!";}return a.exec();
}
  • 与界面数据同步:假设在一个图形界面应用中,有一个 QTextEdit 控件用于显示文本内容,并且有一个 “保存” 按钮。当用户点击 “保存” 按钮时,将 QTextEdit 中的内容保存到文件中,示例代码如下:
#include <QApplication>
#include <QWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QFile>
#include <QTextStream>// 保存文件的槽函数
void saveFile(QTextEdit *textEdit)
{QString fileName = "saved_text.txt";QFile file(fileName);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);out << textEdit->toPlainText();file.close();} else {qWarning() << "无法保存文件";}
}int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QTextEdit *textEdit = new QTextEdit(&window);QPushButton *saveButton = new QPushButton("保存", &window);layout.addWidget(textEdit);layout.addWidget(saveButton);QObject::connect(saveButton, &QPushButton::clicked, [textEdit]() {saveFile(textEdit);});window.show();return app.exec();
}

3.3 定时器与界面动态更新

QTimer 是 Qt 中用于实现定时任务的类,可用于实现界面的动态更新。例如,实现一个简单的数字时钟,每秒更新一次显示:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QTimer>
#include <QVBoxLayout>
#include <QDateTime>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout layout(&window);QLabel *clockLabel = new QLabel(&window);layout.addWidget(clockLabel);QTimer *timer = new QTimer(&window);timer->setInterval(1000); // 每1000毫秒(1秒)触发一次QObject::connect(timer, &QTimer::timeout, [clockLabel]() {QString currentTime = QDateTime::currentDateTime().toString("hh:mm:ss");clockLabel->setText(currentTime);});timer->start();window.show();return app.exec();
}

在上述代码中,创建了一个 QTimer 对象,并设置其时间间隔为 1 秒。通过 connect 将定时器的 timeout 信号连接到一个 Lambda 表达式,在表达式中获取当前时间并更新 QLabel 的文本内容,从而实现了界面的动态更新 。定时器在很多场景中都有应用,比如在一个网络监控应用中,可以使用定时器定时检查网络连接状态,并在界面上实时显示连接状态的变化;在一个动画展示应用中,通过定时器定时更新动画的帧,实现流畅的动画效果。

四、实战项目:简易计算器(Qt 版)

4.1 项目需求

  • 支持基本运算:该简易计算器需实现加、减、乘、除四种基本算术运算,以满足用户日常简单数学计算需求。比如用户输入 “3 + 5”,计算器应能准确得出结果 “8” 。
  • 界面美观:采用合理的布局和配色方案,使界面简洁明了、操作便捷。比如使用 QGridLayout 将数字按钮和运算符按钮整齐排列,设置按钮和显示区域的背景颜色、字体大小和颜色等属性,以提升用户体验。
  • 错误提示:当用户进行非法操作,如输入不完整的表达式、除以零等情况时,计算器应能及时给出清晰的错误提示信息。例如,当用户尝试除以零时,弹出 QMessageBox 提示框显示 “错误:不能除以零”。

4.2 控件布局与信号槽连接实现交互逻辑

  • 控件布局:使用 QGridLayout 来布局计算器的按钮和显示区域。数字按钮 “0 - 9”、运算符按钮 “+”“-”“*”“/”、小数点按钮 “.”、等号按钮 “=” 以及清除按钮 “C” 等,按照类似计算器的标准布局方式排列在网格中。例如,数字按钮 7、8、9 排在第一行的前三列,运算符除号排在第一行第四列;数字按钮 4、5、6 排在第二行前三列,以此类推。显示区域使用 QLineEdit 控件,放置在顶部,用于显示用户输入的表达式和计算结果,并设置为只读属性,防止用户直接在显示区域编辑内容。
  • 信号槽连接:为每个按钮的 clicked 信号连接相应的槽函数。数字按钮的槽函数用于将按钮上的数字追加到显示区域的文本中;运算符按钮的槽函数记录当前输入的数字和运算符,清空显示区域以便输入下一个数字;等号按钮的槽函数解析显示区域的表达式,根据记录的运算符执行相应的计算,并将结果显示在显示区域;清除按钮的槽函数则清空显示区域的文本和相关计算记录。例如,连接数字按钮 5 的 clicked 信号到如下槽函数:
void Calculator::onNumberButtonClicked()
{QPushButton *button = qobject_cast<QPushButton*>(sender());if (button) {QString number = button->text();display->setText(display->text() + number);}
}

连接加号按钮的 clicked 信号到如下槽函数:

void Calculator::onOperatorButtonClicked()
{QPushButton *button = qobject_cast<QPushButton*>(sender());if (button) {QString operatorSymbol = button->text();if (!currentNumber.isEmpty()) {firstOperand = currentNumber.toDouble();currentOperator = operatorSymbol;currentNumber.clear();display->setText("");}}
}

4.3 界面美化与功能测试

  • 界面美化(样式表 QSS):使用 QSS 为计算器界面设置样式。例如,设置按钮的背景颜色,当鼠标悬停在按钮上时改变背景颜色以提供交互反馈;设置按钮的边框样式和大小;设置显示区域的字体大小、颜色和背景颜色等。在项目中创建一个.qss 文件,如 “calculator.qss”,内容如下:
QPushButton {background-color: #f0f0f0;border: 1px solid #ccc;padding: 10px;font-size: 16px;
}
QPushButton:hover {background-color: #e0e0e0;
}
QLineEdit {background-color: #ffffff;border: 1px solid #ccc;padding: 5px;font-size: 20px;text-align: right;
}

在主函数中加载该 QSS 文件:

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include "Calculator.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);QFile file(":/calculator.qss");if (file.open(QFile::ReadOnly | QFile::Text)) {QTextStream stream(&file);app.setStyleSheet(stream.readAll());file.close();}Calculator calculator;calculator.show();return app.exec();
}
  • 功能测试:对计算器的各项功能进行全面测试。测试基本运算功能时,输入各种不同的数字组合和运算符,检查计算结果是否正确,如 “3 + 5”“10 - 2.5”“4 * 6”“15 / 3” 等;测试错误处理功能,尝试输入非法表达式,如 “3 + / 2”“5 / 0” 等,验证是否能正确弹出错误提示;测试界面交互功能,检查按钮点击是否响应正常,显示区域的文本更新是否及时准确等。通过反复测试,确保计算器的功能稳定可靠,满足项目需求。
http://www.dtcms.com/a/438855.html

相关文章:

  • LeetCode199
  • 潍坊网站建设小程序制作深圳活动策划设计机构
  • 《SaaS网关多租户治理:从串流到稳控的实践》
  • 网站后台登录地址修改大诚设计网站建设
  • 官方网站开发制作公司做亚马逊跨境电商赚钱吗
  • 【读书笔记】VC++软件快捷键
  • AT_abc328_g Cut and Reorder 题解
  • 怎样把自己的网站进行推广国际国内时事新闻
  • 为什么isis比ospf更具有扩展性
  • Windows 10系统编程——进程专题:枚举我们进程的状态
  • 【开题答辩实录分享】以《基于协同过滤算法的经济型酒店推荐系统》为例进行答辩实录分享
  • 湘潭网站建设 都来磐石网络wordpress首页设计
  • labelme 创建AI多边形功能
  • 生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape
  • 你们需要网站建设怎么注销公司法人身份
  • 序列化和反序列化(redis为例)
  • 之江汇学校网站建设wordpress 不显示评论
  • 洛谷 - 背包题目详解(超详细版)
  • 自主进化的AI大模型架构设想(解决大模型时效性问题):知识网络的拓扑设计
  • 网站建设所需费用明细应不应该购买老域名建设新网站
  • 突破传统!基于SAM架构的双模态图像分割:让AI“看见“红外与可见光的完美融合
  • Agentic Schemas:构建未来多智能体协作架构的实践蓝图
  • 血玥珏-MIDI音符合理性筛选处理器 v1.0.0.6 使用说明
  • 网站建设维诺之星抖音seo排名源码
  • 深入理解:Rust 的内存模型
  • 深圳建站公司推荐宣传片制作费用报价表
  • Zig 语言通用代码生成器:逻辑冒烟测试版五,数据库自动反射功能
  • 基于 GEE 制作研究区遥感影像可用性地图
  • 微PE | 辅助安装Window系统
  • 企业网站怎么维护易语言做试用点击网站