QT---------GUI程序设计基础

代码UI化设计(QT)

实例功能概述

假设我们要创建一个简单的计算器应用程序。该应用程序具有以下功能:

  • 包含数字按钮(0-9)、操作符按钮(+、-、*、/)、等于按钮(=)和清除按钮(C)。
  • 有一个显示计算结果和输入表达式的文本框。
  • 用户可以通过点击按钮输入数字和操作符,并进行简单的四则运算,点击等于按钮得出结果,点击清除按钮清除输入和结果。
实例功能实现

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QString>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void onNumberButtonClicked();void onOperatorButtonClicked();void onEqualButtonClicked();void onClearButtonClicked();private:QLabel *displayLabel;QString expression;QPushButton *createButton(const QString &text, const char *member);QGridLayout *gridLayout;
};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QString>
#include <iostream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), expression("")
{// 创建显示标签displayLabel = new QLabel("0", this);displayLabel->setAlignment(Qt::AlignRight);displayLabel->setFont(QFont("Arial", 20));// 创建网格布局gridLayout = new QGridLayout();// 创建数字按钮QStringList numberButtons = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "0", "."};int row = 1, col = 0;for (const QString &text : numberButtons) {QPushButton *button = createButton(text, SLOT(onNumberButtonClicked()));gridLayout->addWidget(button, row, col);col++;if (col > 2) {col = 0;row++;}}// 创建操作符按钮QStringList operatorButtons = {"+", "-", "*", "/"};row = 1;col = 3;for (const QString &text : operatorButtons) {QPushButton *button = createButton(text, SLOT(onOperatorButtonClicked()));gridLayout->addWidget(button, row, col);row++;}// 创建等于按钮QPushButton *equalButton = createButton("=", SLOT(onEqualButtonClicked()));gridLayout->addWidget(equalButton, 4, 3);// 创建清除按钮QPushButton *clearButton = createButton("C", SLOT(onClearButtonClicked()));gridLayout->addWidget(clearButton, 0, 3);// 主布局QVBoxLayout *mainLayout = new QVBoxLayout();mainLayout->addWidget(displayLabel);mainLayout->addLayout(gridLayout);QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(mainLayout);setCentralWidget(centralWidget);
}MainWindow::~MainWindow()
{// 析构函数中释放资源
}QPushButton *MainWindow::createButton(const QString &text, const char *member)
{QPushButton *button = new QPushButton(text, this);button->setFont(QFont("Arial", 20));connect(button, SIGNAL(clicked()), this, member);return button;
}void MainWindow::onNumberButtonClicked()
{QPushButton *button = qobject_cast<QPushButton*>(sender());if (button) {expression += button->text();displayLabel->setText(expression);}
}void MainWindow::onOperatorButtonClicked()
{QPushButton *button = qobject_cast<QPushButton*>(sender());if (button) {expression += button->text();displayLabel->setText(expression);}
}void MainWindow::onEqualButtonClicked()
{QString result = "";// 简单的计算逻辑,这里可以使用更复杂的表达式求值算法if (!expression.isEmpty()) {std::string expr = expression.toStdString();try {double eval = 0;// 简单计算eval = eval_expression(expr); result = QString::number(eval);} catch (const std::exception &e) {result = "Error";}displayLabel->setText(result);expression = result;}
}void MainWindow::onClearButtonClicked()
{expression = "";displayLabel->setText("0");
}

使用CMake构建系统

CMake项目配置

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)project(CalculatorApp)# 查找所需的QT模块
find_package(Qt5 COMPONENTS Widgets REQUIRED)# 添加可执行文件
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)set(SOURCESmainwindow.cppmain.cpp
)set(HEADERSmainwindow.h
)add_executable(CalculatorApp${SOURCES}${HEADERS}
)# 链接QT库
target_link_libraries(CalculatorApp Qt5::Widgets)
CMake项目构建
  1. 创建项目目录结构

    CalculatorApp/
    ├── CMakeLists.txt
    ├── main.cpp
    ├── mainwindow.cpp
    ├── mainwindow.h
    
  2. 配置CMake

    cd CalculatorApp
    mkdir build
    cd build
    cmake..
    
  3. 构建项目

    make
    

代码解释

mainwindow.h

  • 定义了 MainWindow 类,继承自 QMainWindow,包含显示计算结果的 QLabel 以及处理各种按钮点击事件的槽函数。
  • Q_OBJECT 宏是为了启用信号与槽机制。

mainwindow.cpp

  • MainWindow 的构造函数中,创建并布局了各种按钮和显示标签。
  • createButton 函数用于创建按钮并连接相应的槽函数。
  • 不同的槽函数(如 onNumberButtonClickedonOperatorButtonClicked 等)处理不同按钮的点击事件。

CMakeLists.txt

  • cmake_minimum_required(VERSION 3.5):指定所需的CMake最低版本。
  • find_package(Qt5 COMPONENTS Widgets REQUIRED):查找QT的Widgets模块。
  • set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)set(CMAKE_AUTOUIC ON):启用自动生成MOC、RCC和UIC文件。
  • add_executable(CalculatorApp ${SOURCES} ${HEADERS}):创建可执行文件。
  • target_link_libraries(CalculatorApp Qt5::Widgets):将可执行文件与QT的Widgets库链接。

使用步骤:

  1. 确保已安装QT和CMake。
  2. 创建上述项目目录结构并将代码文件和CMake文件放入其中。
  3. 按照上述步骤配置和构建项目。
  4. 运行生成的可执行文件,即可看到一个简单的计算器应用程序。
    在这里插入图片描述

注意事项:

  • 在使用CMake构建QT项目时,确保QT的开发环境变量设置正确,以便CMake能找到QT库。
  • 对于更复杂的项目,可能需要添加更多的源文件、头文件和资源文件,相应地需要在 CMakeLists.txt 中进行配置。

使用 CMake-GUI 创建 Visual Studio 项目(基于 QT)

一、准备工作

  1. 确保已经安装了以下软件:
    • Visual Studio:不同版本均可,但建议使用较新的稳定版,如 Visual Studio 2019 或 2022,安装时要包含 C++ 开发组件。
    • CMake:下载并安装适合你操作系统的版本,CMake 是跨平台的项目构建工具,它将帮助我们生成 Visual Studio 项目文件。
    • QT:安装 QT 开发环境,根据你的需求选择相应的版本和模块。例如,如果你要进行图形界面开发,要确保安装了 QT Widgets 等基础模块。

二、打开 CMake-GUI

  1. 启动 CMake-GUI 应用程序,你会看到它的主界面分为几个主要区域:
    • 上部:用于设置源目录(Where is the source code)和构建目录(Where to build the binaries)。
    • 中部:各种配置选项,会根据项目的特性而有所不同。
    • 下部:操作按钮,如“Configure”“Generate”等。

三、配置源目录和构建目录

  1. 在“Where is the source code”文本框中,浏览并选择你的 QT 项目的根目录,这个目录包含了你的项目源代码文件(通常是 .cpp.h 文件以及 CMakeLists.txt 文件)。
    • 例如,如果你的项目名为“MyQTProject”,且存放在 C:\Projects\MyQTProject 目录下,就将此目录填入源目录文本框。
  2. 在“Where to build the binaries”文本框中,选择一个用于存放构建生成文件的目录,这个目录最好与源目录分开,方便管理。
    • 可以在源目录同级创建一个名为“build”的目录,如 C:\Projects\MyQTProject\build,并将其填入构建目录文本框。

四、点击“Configure”按钮

  1. 此时 CMake-GUI 会弹出一个对话框,让你选择生成器(Generator)。
    • 因为我们要创建 Visual Studio 项目,所以在下拉列表中选择对应的 Visual Studio 版本,如“Visual Studio 17 2022”(对应 Visual Studio 2022)或“Visual Studio 16 2019”等。
    • 同时,根据你的系统是 32 位还是 64 位,选择相应的平台选项,如“Win32”或“x64”。点击“OK”。
  2. CMake 开始配置项目,它会读取源目录下的 CMakeLists.txt 文件,检查依赖关系,尝试找到所需的库和头文件路径,包括 QT 相关的库。这个过程可能会出现一些错误提示,常见的问题及解决方法如下:
    • 找不到 QT 库
      • 原因:可能是 QT 安装路径未被 CMake 正确识别。
      • 解决方法:在 CMake-GUI 界面中,找到与 QT 相关的变量,如“QT_DIR”“QT_QMAKE_EXECUTABLE”等,手动将其值设置为 QT 的实际安装路径。例如,如果 QT 安装在 C:\Qt\5.15.2\msvc2019_64,则将对应的变量值修改为此路径。
    • 编译选项不兼容
      • 原因:不同版本的软件组件之间可能存在编译选项冲突。
      • 解决方法:仔细查看错误提示,根据提示调整 CMakeLists.txt 文件中的编译选项,例如,更改某些库的链接方式、包含头文件的路径等。

五、配置项目细节(可选)

  1. 在 CMake 完成首次配置后,你可以在 CMake-GUI 的中部区域看到一系列的配置选项。
    • 一些常用的选项包括:项目的名称、版本号、生成的可执行文件或库的类型(静态库、动态库、可执行程序等)。
    • 对于 QT 项目,还可能涉及到 QT 模块的选择,如是否启用 QT Widgets、QT Multimedia 等模块,你可以根据项目需求勾选或取消勾选相应的选项。

六、点击“Generate”按钮

  1. 当你对配置选项满意后,点击“Generate”按钮。
    • CMake 会根据你的配置生成 Visual Studio 项目文件,这个过程通常很快。生成成功后,你会在构建目录下看到一系列的文件和子目录,其中最重要的是一个扩展名为 .sln 的解决方案文件,这就是你的 Visual Studio 项目文件。

七、打开 Visual Studio 项目

  1. 进入构建目录,找到生成的 .sln 文件,双击打开它,Visual Studio 将会启动并加载你的项目。
  2. 在 Visual Studio 中,你可以像往常一样进行项目的编译、调试等操作。需要注意的是,由于是 QT 项目,可能在运行时需要配置一些 QT 相关的环境变量,确保程序能够正确找到 QT 库,避免运行时错误,如“找不到 QT 插件”等问题。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

torch.nn.functional的用法

文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块&#xff0c;提供了许多函数式的神经网络操作&#xff0c;包括激活函数、损失函数、卷…

关于Nginx

1.Nginx的配置 proxy_pass http: 当你需要将请求分发到多个后端服务器时&#xff0c;需要实现负载均衡功能&#xff0c;可以使用upstream指令定义一组服务器&#xff0c;并在proxy_pass中引用这个服务组名称。。如果不需要负载均衡&#xff0c;只需要将请求转发到单一的后端…

redis用途都有哪些

Redis&#xff0c;作为一个开源的高性能键值对数据库&#xff0c;其用途广泛且功能强大。 1. 缓存&#xff08;Caching&#xff09;&#xff1a; • Redis常被用作缓存层&#xff0c;存储那些频繁访问但不易改变的数据&#xff0c;如用户会话、商品详情等。 • 通过将这些数据存…

Gemma2 2B 模型的model.safetensors.index.json文件解析

Gemma2 2B 模型的 model.safetensors.index.json 文件解析 在使用 Gemma2 2B 模型或其他大型预训练模型时&#xff0c;model.safetensors.index.json 文件起到了索引的作用&#xff0c;它帮助我们了解模型的结构、参数存储方式以及如何加载模型的具体权重。本博客将深入解析该…

JSON结构快捷转XML结构API集成指南

JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…

期权懂|期权入门知识:开通50ETF期权需要什么条件?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 开通50ETF期权需要什么条件&#xff1f; 一、基本资格要求 &#xff08;1&#xff09;年龄限制&#xff1a;投资者必须年满18周岁&#xff0c;具备完全民事行为能力。 &#…

实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集

常见的实景三维处理软件及其特色功能如下&#xff1a; 一、专业实景三维建模软件 Agisoft Metashape 高精度建模&#xff1a;能够生成高精度的三维模型&#xff0c;精度可以达到厘米级甚至毫米级&#xff0c;适用于需要详细测量和分析的项目&#xff0c;如文物保护和建筑测量。…

实战指南:Shiro、CAS打造完美单点登录体验

引言 想象一下&#xff0c;在日常工作中&#xff0c;我们经常需要进行系统认证和授权。当用户尝试登录一个网站时&#xff0c;他们需要提供用户名和密码&#xff0c;网站会检查这些信息&#xff0c;确认用户是谁。这就是认证的过程。 一旦用户被认证&#xff0c;他们可能会尝…

cuda-cuDnn

cuda sudo /bin/sh cuda_11.7.0_515.43.04_linux.run cudnn cuDNN Archive | NVIDIA Developer Linux 系统 CUDA 多版本共存以及切换 – 颢天 安装cuda # 如果已经安装过驱动&#xff0c;驱动不需要再安装&#xff0c;取消勾选 安装cuDNN&#xff0c;cuda-cuDNN对应关系见…

QComboBox中使用树形控件进行选择

事情是这样的&#xff0c;要在一个ComboBox中通过树形结构进行内容的选择。 默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew…

【网络协议】路由信息协议 (RIP)

未经许可&#xff0c;不得转载。 路由信息协议&#xff08;Routing Information Protocol&#xff0c;简称 RIP&#xff09;是一种使用跳数&#xff08;hop count&#xff09;作为路由度量标准的路由协议&#xff0c;用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

LoRA微调系列笔记

系列文章目录 第一章&#xff1a;LoRA微调系列笔记 第二章&#xff1a;Llama系列关键知识总结 第三章&#xff1a;LLaVA模型讲解与总结 文章目录 系列文章目录LoRA&#xff1a;Low-Rank Adaptation of Large Language Models目的&#xff1a;依据&#xff1a;优势&#xff1a;…

SRS 服务器入门:实时流媒体传输的理想选择

在当今视频流媒体需求爆炸式增长的时代&#xff0c;如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS&#xff08;Simple Realtime Server&#xff09;作为一款开源的流媒体服务器&#xff0c;以其卓越的性能和灵活的功能&#xff0c;…

C++第五六单元测试

1【单选题】在公有派生类的成员函数不能直接访问基类中继承来的某个成员&#xff0c;则该成员一定是基类中的&#xff08; C &#xff09;。&#xff08;2.0分&#xff09; A、公有成员B、保护成员C、私有成员D、保护成员或私有成员 注意从类外访问与从派生类中访问 2【单…

使用Python可视化有压缩格式的Bitmap(BMP)图像调色板数据

使用Python可视化有压缩格式的Bitmap BMP图像调色板数据 参考文章一、调色板数据二、测试代码三、测试结果 参考文章 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据Bitmap(BMP)图像信息分析主要说明带压缩的形式Bitmap(BMP)图像信息验证 一、调色板数据 Color Palette…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

html+css+js网页设计 美食 美食家6个页面

htmlcssjs网页设计 美食 美食家6个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯&#xff1a;是直接控制输出引脚&#xff0c;GPIO初始化推挽输出即可 按键控制LED&#xff1a;是按键输入信号从而控制输出引脚&#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

Java的list中状态属性相同返回true的实现方案

文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断&#xff0c;状态值相等时&#xff0c;总体返回为true。 方案一、for循环实现 实现思路 遍历list&#xff0c;当出现不一致时&#xff0c;直接跳出循环…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差&#xff1a;模型在训练数据上的误差 泛化误差&#xff1a;模型在新数据上的误差 验证数据集&#xff1a;一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集&#xff1a;只能用一次 K则交叉验证 在没有足够数据时使用 算法…