使用QT纯代码创建(查找)对话框详细步骤与代码

news2025/1/15 23:37:42

一、创建项目文件

打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application

为项目起名字

 输入类的名字

二、 了解每个文件的作用

项目创建完毕之后就会出现以下几个文件,先来分别介绍以下这些文件的作用。

Headers->finddialog.h——很显然这是头文件,这个文件的作用是用来定义类以及前置声明一些类(前置声明会告诉C++编译程序类的存在,而不用提供类定义的所有细节)

Sources->finddialog.cpp——这是一个源文件,这个文件的作用是用来实现上述头文件中的类以及提供类定义的成员函数的细节。

Sources->main.cpp——这也是一个源文件,作用是调用上面自己创建的对话框类,实现(查找)对话框的展示。

Forms->finddialog.ui——这是一个可视化设计的窗体的定义文件,也就是像C#一样拖动控件来实现界面设计。(但本项目完全通过代码来实现对话框,所以暂时不需要打开这个文件进行操作)

实现效果:

 

 三、具体代码【详细注释】

  •  finddialog.h

【创建所要用到的窗口部件】

//防止对这个头文件多重包含
#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QMainWindow>
#include <QDialog>
#include <QtGui>

//QT_NAMESPACE是Qt自己定义的命名空间。
QT_BEGIN_NAMESPACE
namespace Ui { class finddialog; }
QT_END_NAMESPACE

class QCheckBox;//复选框
class QLabel;//一个用于显示文本或图像的窗口部件
class QLineEdit;//单行文本输入框
class QPushButton;//按钮

//窗口部件定义方式,parent参数指定了它的父窗口部件,默认值是一个空指针,意味着该对话框没有父对象
class finddialog : public QDialog
{
    Q_OBJECT //这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力

public:
    finddialog(QWidget *parent = nullptr);//构造函数
    ~finddialog();//析构函数
    
signals://声明当用户单击Find按钮时对话框所发射的两个信号  预处理器会在编译前找到signal并转换成标准C++代码
    //Qt::CaseSensitivity 是一个枚举类型,有Qt::CaseSensitive(区分大小写)和Qt::CaseInsensitive(不区分大小写)两个取值
    void findNext(const QString &str,Qt::CaseSensitivity cs);//向后查询
    void findPrevious(const QString &str,Qt::CaseSensitivity cs);//向前查询

private slots://声明了两个槽
    void findClicked();//当点击find按钮时触发
    void enableFindButton(const QString &text);// 启用or禁用find按钮

private:
    Ui::finddialog *ui;
    QLabel *label;//标签
    QLineEdit*lineEdit;//编辑栏
    QCheckBox *caseCheckBox;//是否大小写敏感复选框
    QCheckBox *backwardCheckBox;//查找上一个复选框
    QPushButton *findButton;//查找按钮
    QPushButton *closeButton;//关闭按钮
};
#endif // FINDDIALOG_H
  •  finddialog.cpp

【初始化创建的窗口部件并实现函数功能】

#include "finddialog.h"
#include "ui_finddialog.h"
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>

finddialog::finddialog(QWidget *parent)//构造函数实现
    : QDialog(parent) //基类
    , ui(new Ui::finddialog)
{
    //tr()的原型是QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言
    //与操作运算符&表示快捷键
    label=new QLabel(tr("find &what:"));//展示提示语的标签
    lineEdit= new QLineEdit;//初始化行编辑器
    label->setBuddy(lineEdit);//设置了行编译器作为标签的伙伴
    
    caseCheckBox=new QCheckBox(tr("Match &case"));//使用快捷键 Alter+C 勾选/取消框
    backwardCheckBox=new QCheckBox(tr("Search &backward"));//快捷键 Alter+B 勾选/取消框

    findButton=new QPushButton(tr("&Find"));//按下快捷键 Alter+F 激活按钮
    findButton->setDefault(true);//让find按钮成为对话框的默认按钮 按下enter时能够按下对应按钮
    findButton->setEnabled(false);//禁用Find按钮

    closeButton=new QPushButton(tr("Close"));
    
    //因为QObject是finddialog的父对象之一,因此可以省略connect前面的QObject::前缀
    //只要行编辑器中的文本发生变化,就会调用私有槽使得find按钮可用/禁用
    connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));
    //用户单击Find按钮 调用私有槽判断查找条件并进行查找
    connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked()));
    //用户单击close按钮,对话框会关闭
    connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
    //close槽是从QWidget中继承而来的,默认行为就是将窗口部件从用户视野中隐藏起来

    //使用布局管理器摆放子窗口部件 嵌套实现
    //QHBoxLayout 水平布局,在水平方向上排列控件,即:左右排列
    QHBoxLayout *topLeftLayout =new QHBoxLayout;
    //将lable和lineEdit添加到布局上
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    //QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。
    QVBoxLayout *leftLayout = new QVBoxLayout;
    //将刚才的布局放在左边页面的上方
    leftLayout->addLayout(topLeftLayout);
    //将两个复选框放在其下方
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    //设计右边页面
    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();//添加一个伸展器用来占据剩下的空白区域

    //总页面设计
    QHBoxLayout *mainLayout =new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);
    setWindowTitle(tr("FIND"));//标题设置
    setFixedHeight(sizeHint().height());//宽高设置
}
//单击Find按钮,会发射两个信号,具体取决于复选框的选择
void finddialog::findClicked()
{
    QString text=lineEdit->text();
    //Qt::CaseSensitive区分大小写   Qt::CaseInSensitive不区分大小写
    //判断caseCheckBox是不是选中,如果选中 就返回 Qt::CaseInsensitive,否则返回Qt::CaseSensitive
    //用于判断是不是大小写敏感的查找
    Qt::CaseSensitivity cs=caseCheckBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive;
    //如果 backwardCheckBox 被选中,就 emit(发出)信号findPrevious(),否则emit信号findNext 查找前一个/后一个
    if (backwardCheckBox->isChecked())
    {
        emit findPrevious(text,cs);
    }
    else {
        emit findNext(text,cs);
    }
}
//改变了行编辑器中的文本,会调用这个槽
void finddialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());//如果行编辑器里面有文本,就会启动Find按钮,否则就会禁用按钮
}


finddialog::~finddialog()
{
    delete ui;
}

  •  main.cpp

【调用创建的finddialog类实现界面】

#include "finddialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    finddialog *dialog=new finddialog;
    dialog->show();
    return a.exec();
}

 

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

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

相关文章

Java:函数式(Functional)接口

文章目录 1 什么是函数式接口2 如何理解函数式接口3 举例Java 内置函数式接口1 之前的函数式接口2 四大核心函数式接口3.4.3 其它接口 内置接口代码演示 5 练习 1 什么是函数式接口 只包含一个抽象方法&#xff08;Single Abstract Method&#xff0c;简称SAM&#xff09;的接…

虚拟机/双系统Ubuntu扩容

虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具&#xff1a;sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照&#xff0c;不然gg了…

系统架构设计专业技能 · 计算机网络(三)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

&#x1f389;欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

Android应用开发(37)LTPO帧率测试基于Surfaceview(暂存)

Android应用开发学习笔记——目录索引 参考android官网&#xff1a; Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

wangEditor5实现@评论功能

需求描述&#xff1a;在输入框输入后显示用户列表&#xff0c;实现人功能 当前环境&#xff1a;vue3viteelementPluswangEditor5 需要插件&#xff1a;wangeditor/plugin-mention 安装插件&#xff1a;npm i wangeditor/plugin-mention 输入框组件分两部分&#xff1a;1. wa…

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…

CAS服务端入门使用实践

CAS服务端入门使用实践 一、前言 1.简介 CAS 是一个企业多语言单点登录解决方案&#xff0c;支持大量附加身份验证协议和功能&#xff0c;满足身份验证和授权需求的综合平台。 2.环境 Windows 10JDK 1.8git version 2.41.0.windows.3Tomcat 9.0.78Maven 3.5.3cas-overlay-…

类与对象(加深)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果…

51.C++继承

今天进行了新的学习关于c继承的知识。 目录 1.继承 基类and派生类 访问控制和继承 单继承 多继承 2.同名隐藏 1.继承 在C中&#xff0c;继承是一种面向对象编程的重要特性&#xff0c;用于构建类之间的层次关系。通过继承&#xff0c;一个类可以从另一个类继承其…

QT网络编程之TCP

QT网络编程之TCP TCP 编程需要用到俩个类: QTcpServer 和 QTcpSocket。 #------------------------------------------------- # # Project created by QtCreator 2023-08-

2023-08-12 LeetCode每日一题(合并 K 个升序链表)

2023-08-12每日一题 一、题目编号 23. 合并 K 个升序链表二、题目链接 点击跳转到题目位置 三、题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 示例 2&…

String(字符串)

1、String概述 java.lang.String类代表字符串&#xff0c;Java程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都为此类的对象。 1.1、String的注意点 字符串的内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改。 1.2、总结 String是Java定义好的一个类…

LeetCode 34题:在排序数组中查找元素的第一个和最后一个位置

目录 题目 思路 代码 C语言 Python 题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(…

取证--理论

资料&#xff1a; 各比赛 Writeup &#xff1a; https://meiyacup.cn/Mo_index_gci_36.html 哔站比赛复盘视频&#xff1a; https://space.bilibili.com/453117423?spm_id_from333.337.search-card.all.click 自动分析取证四部曲 新建案例添加设备自动取证制作报告 取证大…

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

全志T113-S3 Tina-linux --1. 开发环境搭建

1. 硬件环境 1.1 开发板 型号&#xff1a;100ASK_T113-PRO Base V1.1&#xff08;韦东山&#xff09;配置&#xff1a;CPU&#xff1a;T113-S3&#xff0c;RAM&#xff1a;128MB&#xff0c;ROM&#xff1a;128MB T113-S3配置 1.2 上手使用 1.2.1 串口shell 串口shell配置…

MySQL8安装教程 保姆级(Windows))

下载 官网: mysql官网点击Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者点击MySQL installer for Windows) Windows下有两种安装方式 在线安装 一般带有 web字样 这个需要联网离线安装 一般没有web字样 安装 下载好之后,版本号可以不一样&…

【积水成渊】9 个CSS 伪元素

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

预测知识 | 预测技术流程及模型评价

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价技术流程模型评价参考资料 技术流程 1&#xff09;模型训练阶段&#xff1a;预测因素和结局&#xff0c;再加上预测模型进行模型拟合&#xff1b; 2&#xff09;预测阶段&#xff1a;将预测因素代入拟…