Pasos detallados y código para crear (buscar) un cuadro de diálogo usando código puro QT

1. Crea archivos de proyecto

Abra Qt Creator->Archivo->Nuevo archivo o proyecto->Seleccione la aplicación Qt Widgets

Dale un nombre al proyecto.

 Ingrese el nombre de la clase

2. Comprenda la función de cada archivo

Una vez creado el proyecto, aparecerán los siguientes archivos. Primero introduzcamos las funciones de estos archivos.

Headers->finddialog.h : obviamente, este es un archivo de encabezado. El propósito de este archivo es definir clases y declarar previamente algunas clases (las declaraciones previas le indicarán al compilador de C++ que la clase existe sin proporcionar todas las definiciones de clase). )

Fuentes->finddialog.cpp : este es un archivo fuente. El propósito de este archivo es implementar la clase en el archivo de encabezado anterior y proporcionar detalles de las funciones miembro de la definición de clase.

Fuentes->main.cpp : este también es un archivo fuente. Su función es llamar a la clase de diálogo creada anteriormente para realizar la visualización del cuadro de diálogo (búsqueda).

Forms->finddialog.ui : este es un archivo de definición para un formulario diseñado visualmente, lo que significa arrastrar controles como C# para implementar el diseño de la interfaz. (Pero este proyecto implementa el cuadro de diálogo completamente a través del código, por lo que aún no es necesario abrir este archivo para su funcionamiento)

Efecto de realización:

 

 3. Código específico [notas detalladas]

  •  encontrardialog.h

[Cree los widgets que se utilizarán]

//防止对这个头文件多重包含
#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
  •  encontrardialog.cpp

[Inicializar los widgets creados e implementar funciones funcionales]

#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;
}

  •  principal.cpp

[Llame a la clase finddialog creada para implementar la interfaz]

#include "finddialog.h"

#include <QApplication>

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

 

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/132252719
Recomendado
Clasificación