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

一、创建项目文件

打开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();
}

 

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

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

相关文章

2023年国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

c语言每日一练(5)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

【三维编辑】Seal-3D:基于NeRF的交互式像素级编辑

文章目录 摘要一、引言二、方法2.1.基于nerf的编辑问题概述2.2.编辑指导生成2.3.即时预览的两阶段学生训练 三、实验四、代码总结 项目主页: https://windingwind.github.io/seal-3d/ 代码&#xff1a;https://github.com/windingwind/seal-3d/ 论文: https://arxiv.org/pdf/23…

k8s-----集群调度

目录 一&#xff1a;调度约束 二&#xff1a;Pod 启动创建过程 三&#xff1a;k8s调度过程 1、Predicate 有一系列的常见的算法 2、常见优先级选项 3、指定调度节点 &#xff08;1&#xff09;nodeName指定 &#xff08;2&#xff09;nodeSelector指定 四&#xff1a;亲和…

并发编程面试题2

并发编程面试题2 一、AQS高频问题&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state…

Mac 卸载appium

安装了最新版的appium 2.0.1,使用中各种问题&#xff0c;卡顿....,最终决定回退的。记录下卸载的过程 1.打开终端应用程序 2.卸载全局安装的 Appium 运行以下命令以卸载全局安装的 Appium&#xff1a; npm uninstall -g appium 出现报错&#xff1a;Error: EACCES: permiss…

阿里云服务器带宽计费模式怎么选?有什么区别?

阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算&#xff1f;阿里云百科以北京地域为例&#xff0c;按固定带宽计费1M带宽一个月23元&#xff0c;按使用流量计费1GB流量0.8元&#xff0c;如果云服务器带宽使用率低于10%&#xff0c;那么首选按使用流量计费&#x…

stepin设置菜单icon的两种方式——基础积累

最近在看大佬写的stepin后台管理系统&#xff0c;框架是vue3antd3.xvite&#xff0c;下面记录一下&#xff0c;菜单图标的使用方法。 1.第一种方法就是使用antd中的icon图标 书写方式如下&#xff1a; {path: /,name: 首页,redirect: /analysis,meta: {title: 首页,renderMen…

Untiy Json和Xml的序列化和反序列化

Json的序列化和反序列化 1.定义数据类 [Serializable] public class ZoomPoint {// 点名称, 将作为Key被字典存储public string name;// 轴心X坐标public Vector2 pivot Vector2.one / 2;// 放大倍率&#xff0c;小于1是为缩小倍率&#xff0c;小于0是取绝对值&#xff0c;不…

redis学习笔记(九)

文章目录 python对redis基本操作&#xff08;1&#xff09;连接redis&#xff08;2&#xff09;数据类型操作 python对redis基本操作 &#xff08;1&#xff09;连接redis # 方式1 import redisr redis.Redis(host127.0.0.1, port6379) r.set(foo, Bar) print(r.get(foo))# …

【MOOC】北京理工大学Python网络爬虫与信息提取慕课答案-综合挑出了一些很难评的慕课测验题

1 Requests库中的get()方法最常用&#xff0c;下面哪个说法正确&#xff1f;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬…

mysql 技术总结

一、mysql 索引&#xff08;左小右大&#xff09; 下图中为二叉树 mysql索引类型以及数据结构 BTREE结构 BTree又叫多路平衡搜索树&#xff0c;一颗m叉的BTree特性如下&#xff1a; 树中每个节点最多包含m个孩子。 除根节点与叶子节点外&#xff0c;每个节点至少有[ceil(m/2…

【LeetCode每日一题】——575.分糖果

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 575.分糖果 四【题目描述】 Alice 有 n 枚糖&…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

uniapp软键盘谈起遮住输入框和头部被顶起的问题解决

推荐&#xff1a; pages.json中配置如下可解决头部被顶起和表单被遮住的问题。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同&#xff1f; 一个进程是一个独立(self contained)的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…

snapshotter not loaded: overlayfs: invalid argument

测试containerd是否能创建和启动成功 执行如下命令拉取镜像并创建容器&#xff1a; 拉取容器 ctr i pull docker.io/library/nginx:alpine 创建容器 ctr c create --net-host docker.io/library/nginx:alpine nginx ctr task start -d nginx查看Containerd服务启动信息&…

LAXCUS分布式操作系统:技术创新引领高性能计算与人工智能新时代

随着科技的飞速发展&#xff0c;高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中&#xff0c;LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现&#xff0c;成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技…

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…