一个基于Qt的简单查找对话框

4 篇文章 0 订阅

最近学习Qt时设计了一个简单的查找对话框,大致界面如下:

在这里插入图片描述
当用户输入查找目标,按下查找按钮后,对话框会发射一个信号,信号中包含着查找目标,反向查找标志,匹配大小写标志等关键信息。
代码如下:

//下面是QFindDialog的头文件
#ifndef __QFINDDIALOG_H__
#define __QFINDDIALOG_H__

#include <QDialog>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>

class QFindDialog : public QDialog
{
	Q_OBJECT

protected:
	QLabel *label;
	QLineEdit *lineEdit;
    QGroupBox *groupBox;
	QCheckBox *caseCheckBox;
	QCheckBox *backwardCheckBox;
	QPushButton *findButton;
	QPushButton *closeButton;

signals:
    void clicked(const QString &str, Qt::CaseSensitivity cs, bool direct);
	
protected slots:
    void onTextChanged(const QString &text);
    void onClickedFindButton();
	
protected:
    QFindDialog(QWidget *parent = NULL);
    bool construct();
    bool initFindDialog();
    bool initLeftLayout(QHBoxLayout *layout);
    bool initGroupBox();
    bool initRightLayout(QHBoxLayout *layout);
	
public:
    static QFindDialog* NewInstance(QWidget *parent = NULL);
    virtual ~QFindDialog();
};

#endif
//下面是QFindDialog的实现文件
#include "QFindDialog.h"

void QFindDialog::onTextChanged(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}

void QFindDialog::onClickedFindButton()
{
    emit clicked(lineEdit->text(), caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive, !backwardCheckBox->isChecked());
}

QFindDialog::QFindDialog(QWidget *parent) : QDialog(parent)
{
	label = NULL;
	lineEdit = NULL;
    groupBox = NULL;
	caseCheckBox = NULL;
	backwardCheckBox = NULL;
	findButton = NULL;
	closeButton = NULL;

    setWindowTitle("查找");
    resize(500, 250);
}

bool QFindDialog::construct()
{
	bool ret = true;
	
	ret = ret && (label = new QLabel(this));
	ret = ret && (lineEdit = new QLineEdit(this));
    ret = ret && (groupBox = new QGroupBox(this));
	ret = ret && (caseCheckBox = new QCheckBox(this));
	ret = ret && (backwardCheckBox = new QCheckBox(this));
	ret = ret && (findButton = new QPushButton(this));
	ret = ret && (closeButton = new QPushButton(this));
	
	if(ret)
	{
        label->setText("查找目标(&F):");
		label->setBuddy(lineEdit);

        lineEdit->clear();
        connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(onTextChanged(QString)));

        ret = ret && initGroupBox();

        caseCheckBox->setText("匹配大小写");
        caseCheckBox->setChecked(true);

        backwardCheckBox->setText("反向查找");
        backwardCheckBox->setChecked(false);

        findButton->setText("查找");
        findButton->setDefault(true);
        findButton->setEnabled(false);
        connect(findButton, SIGNAL(clicked()), this, SLOT(onClickedFindButton()));

        closeButton->setText("关闭");
        connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

        ret = ret && initFindDialog();
    }
	
	return ret;
}

bool QFindDialog::initFindDialog()
{
    bool ret = true;
    QHBoxLayout *topLayout = new QHBoxLayout();

    ret = ret && topLayout;

    if(ret)
    {
        topLayout->setSpacing(4);
        //topLayout->setParent(this);

        ret = ret && initLeftLayout(topLayout);
        ret = ret && initRightLayout(topLayout);
        
        setLayout(topLayout);
        //qDebug() << "topLayout->parent = " << topLayout->parent();
    }

    return ret;
}

bool QFindDialog::initLeftLayout(QHBoxLayout *layout)
{
    bool ret = true;
    QVBoxLayout *leftLayout = NULL;
    QHBoxLayout *hLayout = NULL;
    ret = ret && (leftLayout = new QVBoxLayout());
    ret = ret && (hLayout = new QHBoxLayout());

    if(ret)
    {
        leftLayout->setSpacing(4);
        //leftLayout->setParent(layout);

        hLayout->setSpacing(4);
        //hLayout->setParent(leftLayout);
        hLayout->addWidget(label, 1, Qt::AlignCenter);
        hLayout->addWidget(lineEdit, 1, Qt::AlignCenter);

        leftLayout->addLayout(hLayout, 1);
        leftLayout->addWidget(groupBox, 2);

        layout->addLayout(leftLayout, 1);
        //qDebug() << "leftLayout->parent = " << leftLayout->parent();
    }

    return ret;
}

bool QFindDialog::initGroupBox()
{
    bool ret = true;
    QVBoxLayout *vLayout = new QVBoxLayout();
    ret = ret && vLayout;

    if(ret)
    {
        vLayout->setSpacing(4);
        vLayout->setContentsMargins(20, 0, 20, 0);
        vLayout->addWidget(backwardCheckBox, 1, Qt::AlignLeft);
        vLayout->addWidget(caseCheckBox, 1, Qt::AlignLeft);

        groupBox->setLayout(vLayout);
    }

    return ret;
}

bool QFindDialog::initRightLayout(QHBoxLayout *layout)
{
    bool ret = true;
    QVBoxLayout *rightLayout = new QVBoxLayout();

    ret = ret && rightLayout;

    if(ret)
    {
        rightLayout->setSpacing(4);
        //rightLayout->setParent(layout);
        rightLayout->addWidget(findButton, 1, Qt::AlignCenter);
        rightLayout->addWidget(closeButton, 1, Qt::AlignCenter);
        rightLayout->addStretch(5);

        layout->addLayout(rightLayout, 1);
    }

    return ret;
}

QFindDialog* QFindDialog::NewInstance(QWidget *parent)
{
	QFindDialog *ret = new QFindDialog(parent);
	
    if(ret == NULL || !ret->construct())
	{
		delete ret;
		ret = NULL;
	}
	
	return ret;
}

QFindDialog::~QFindDialog()
{
}
运用Qt开发工具来实现一个记事本,用户图形界面操作,通过Qt提供的图形库来设计记事本的管理、应用基本窗口,主要实现打开、新建、保存、另存为、查找、居中、字体、颜色等功能设计,同时在软件内部实现对于这些功能的支持和实现。还有对用户剪切、复制、粘贴、等功能的支持 核心代码讲解 1、打开文件功能 void MainWindow::on_action_2_triggered() { QString filename = QFileDialog::getOpenFileName(this); loadFile(filename); } 打开文件on_action_2_triggered()通过转到槽实现首先定义一个Qstring类型的filename让它获取你文件名,其次寻找它的本地连接。 3、保存文件功能 void MainWindow::on_action_3_triggered() { if(isSaved){ saveFile(curFile); } else{ do_file_SaveAS(); } } 保存文件功能on_action_3_triggered()通过转到槽实现,先判断bool型的isSaved是否是正确的,如果错则保存当前文件,否则执行另存为。 5、关闭功能 void MainWindow::on_action_5_triggered() { if(close){ QMessageBox::information(this,"提示","文件尚未保存,关闭"); }else{ ui->textEdit->close(); } } 关闭功能on_action_5_triggered()先对文本进行判断是否是关闭的,如果是错弹出对话框提示消息文件尚未保存,关闭,否则对文档进行关闭 11、查找功能 //查找 void MainWindow::close_findhangshu() { ui->gridLayoutWidget->close(); } close_findhangshu()对查找对话框进行关闭函数。 void MainWindow::on_action_11_triggered() { QDialog *closefind=new QDialog(this); QDialog *findDlg=new QDialog(this); find_textLineEdit=new QLineEdit(findDlg); QPushButton *find_Bth=new QPushButton(tr("查找一个"),findDlg); QPushButton *close_find=new QPushButton(tr("关闭"),closefind); ui->gridLayout->addWidget(find_textLineEdit); ui->gridLayout->addWidget(find_Bth); ui->gridLayout->addWidget(close_find); connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText())); connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu())); } 查找功能on_action_11_triggered()函数通过转到槽实现下面部分:先定义两个QDialog类型 指针变量*closefind和*findDlg,对它们进行新创建空间, find_textLineEdit=new QLineEdit(findDlg);新建一个空间对QlineEdit它进行传参,将findDlg传入目的是查找在文档中对应的文字,QPushButton *find_Bth=new QPushButton(tr("查找一个"),findDlg);QPushButton *close_find=new QPushButton(tr("关闭"),closefind);这两个代码作用相同定义两个Qpubutton当点击查找功能弹出对话框时在对话框中实现查找一个和关闭connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu()));点击查找一个按钮时对它进行连接,执行show_findText()函数中的查找操作,如果点击关闭执行上述所说的close_findhangshu()关闭对话框操作 void MainWindow:: show_findText() { QString findText=find_textLineEdit->text(); if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText)); } } show_findText()此函数先定义QString类型 findText值,对文本进行扫描,如果文本不能找到找到则提示找不到。 本人也只是一个学生,记得点赞哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值