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_OBJECT

public:
    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(SOURCES
    mainwindow.cpp
    main.cpp
)

set(HEADERS
    mainwindow.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 插件”等问题。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型提示词初探

大模型提示词初探 在与大模型交互的过程中&#xff0c;提示词起着至关重要的作用&#xff0c;它犹如给模型下达的精准任务指令&#xff0c;直接影响着模型生成内容的准确性、高效性与合理性。合理运用提示词&#xff0c;能够有效减少模型出现错误和幻觉的情况&#xff0c;从而…

Navicat 连接 SQL Server 详尽指南

Navicat 是一款功能强大的数据库管理工具&#xff0c;它提供了直观的图形界面&#xff0c;使用户能够轻松地管理和操作各种类型的数据库&#xff0c;包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库&#xff0c;包括安装设置、连接配置、常见问题排…

【Linux】进程间通信-> 共享内存

共享内存原理 在C语言/C中&#xff0c;malloc也可以在物理内存申请空间&#xff0c;将申请的物理内存空间通过页表映射到进程地址空间&#xff0c;将内存空间的起始地址&#xff08;虚拟地址&#xff09;返回&#xff0c;进而进程可以使用虚拟地址通过页表映射到物理内存的方式…

高仿CSDN编辑器,前端博客模板

高仿CSDN编辑器纯前端模板&#xff0c;使用的js、html、vue、axios等技术&#xff0c;网络请求库已进行封装&#xff0c;可以按需调整界面,需要源码联系(4k左右)。 1.支持代码高亮 2.支持目录点击定位 3.支持文件上传、图片上传&#xff08;需要自己写后端接口&#xff09; 4.M…

国产低代码框架zdppy开发笔记002 标准的接口响应

前言 通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架. 我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢? 在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看. 规范的响应 首先来看…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

牛客周赛 Round 74

D. 预知 题目链接 题意有点绕&#xff0c;简单来说是其中一堆牌&#xff0c;问最少预知几张才能保证任取两张都不会导致种类重复。一开始对每张牌种类不是已知的&#xff0c;已知的是每种牌的牌数。 思路就是相当于把其中一种明牌&#xff0c;保证任取两张都不会导致种类重复…

【linux学习指南】SIGCHLD信号

文章目录 &#x1f4dd;SIGCHLD信号&#x1f6a9;总结 &#x1f4dd;SIGCHLD信号 进程⼀章讲过⽤wait和waitpid函数清理僵⼫进程,⽗进程可以阻塞等待⼦进程结束,也可以⾮阻塞地查询是否有⼦进程结束等待清理(也就是轮询的⽅式)。采⽤第⼀种⽅式,⽗进程阻塞了就不能处理⾃⼰的⼯…

AI助力SEO优化的关键词策略解析

内容概要 在数字营销的快速发展中&#xff0c;人工智能&#xff08;AI&#xff09;正逐步成为提升搜索引擎优化&#xff08;SEO&#xff09;效果的重要工具。关键词策略是SEO成功的关键要素之一&#xff0c;而AI技术的应用使得这一过程更加高效和精准。在关键词研究中&#xf…

PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架

PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架&#xff0c;支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想&#xff0c;支持多种经典的访问控制方案&#xff0c;如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容&#xff1a; http…

解决Git中没有小绿勾与红叉叉的问题

一、检查自己的软件 必须安装Git和Tortoisegit&#xff08;也就是俗称的小乌龟&#xff09;这两个软件。 Git的下载地址&#xff1a; CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 寻找与自己电脑相配的软件版本就可以了。 Tor…

搭建跨境电商企业博客的指南

在跨境电商领域&#xff0c;企业博客不仅是展示品牌形象的窗口&#xff0c;也是连接全球客户的重要桥梁。一个精心搭建的企业博客能够提升品牌知名度、增强客户信任&#xff0c;并促进销售。 搭建企业博客的必要性 1. 建立品牌权威&#xff1a;通过高质量的内容&#xff0c;企…

渗透学习笔记(十一)Burp Suite 总结

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

课设CLion连接Ubuntu14makeQt项目出错解决汇总

在这之前需要注意以下几点&#xff1a; 1、需要 确保CLion能连接Ubuntu14 2、cmakelist.txt文件配置 3、知道部署路径&#xff1a; 问题一&#xff1a;/usr/bin/ld: cannot open output file GreedySnake: Is a directory 否则就会出现make以后应该生成一个可执行文件&…

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则&#xff0c;执行的函数// gin.Context&#x…

磁编码器(Magnetic Encoder)

磁编码器&#xff08;Magnetic Encoder&#xff09;是一种传感器&#xff0c;它通过检测磁性材料的磁场变化来测量旋转或线性位置。编写用于读取磁编码器数据的C语言程序时&#xff0c;您需要根据具体的硬件接口和编码器类型进行调整。以下是一个基本的框架&#xff0c;假设我们…

Qt Creator项目构建配置说明

QT安装好之后&#xff0c;在安装目录的Tools\QtCreator\bin下找到qtcreator.exe文件并双击打开 点击文件-新建文件或项目 选择Qt Widgets Application 设置项目名称以及路径 make工具选择qmake&#xff08;cmake还未尝试过&#xff09; 设置主界面对应类的名称、父类&#…

智能边缘计算×软硬件一体化:开启全场景效能革命新征程(企业开发者作品)

边缘智能技术快速迭代&#xff0c;并与行业深度融合。它正重塑产业格局&#xff0c;催生新产品、新体验&#xff0c;带动终端需求增长。为促进边缘智能技术的进步与发展&#xff0c;拓展开发者的思路与能力&#xff0c;挖掘边缘智能应用的创新与潜能&#xff0c;高通技术公司联…

【React】- 跨域PDF预览、下载(改文件名)、打印

我们经常会碰到跨域来方位PDF&#xff0c;同时需要下载、打印的需求&#xff0c;通常由于浏览器的安全策略&#xff0c;可以预览&#xff0c;但是下载和打印可能会受限&#xff0c;这时候怎么办呢&#xff1f; 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件&#xff0c;…

Ps:创建数据驱动的图像

在设计实践中&#xff0c;常常需要处理大量内容变化但设计格式统一的任务&#xff0c;例如批量生成名片、工作证、学生证、胸牌、奖状或证书甚至图册。这些工作如果逐一手动制作&#xff0c;不仅耗时费力&#xff0c;还容易出错。 为解决这一问题&#xff0c;Photoshop 提供了强…