两个qt窗口传值(以记事本查找为例)

来源:互联网 发布:windows自带软件 编辑:程序博客网 时间:2024/06/03 10:59

前两天用qt写了一个记事本程序, 其中要实现查找功能。我们都知道点击记事本的查找按钮, 是会弹出一个对话框,如下图:


这里我们可以看到有两个窗口,问题是怎么把查找对话框的内容传送到主窗口呢? 毕竟是主窗口要搜索textedit实现查找的功能。


这里有两种方法:

方法一:使用signal/slots机制,建立两个窗口mainwindow 和 finddialog, finddialog给mainwindow 传值

话不多说,直接贴代码:

finddialog.h

#ifndef FINDDIALOG_H#define FINDDIALOG_H#include <QDialog>#include <QTextDocument>#include "public_define.h"//#ifndef _MESSAGE_STRUCT_//#define _MESSAGE_STRUCT_//#endifnamespace Ui {class FindDialog;}class FindDialog : public QDialog{    Q_OBJECTpublic:    explicit FindDialog(QWidget *parent = 0);    ~FindDialog();signals:    void SendFindText(QString &str);    void SendFindText(struct message_info &struct_message_info);private slots:    void on_pushButton_find_clicked();    void on_pushButton_cancel_clicked();private:    Ui::FindDialog *ui;    struct message_info m_stru_message_info;};#endif // FINDDIALOG_H

finddialog.cpp

#include "finddialog.h"#include "ui_finddialog.h"FindDialog::FindDialog(QWidget *parent) :    QDialog(parent),    ui(new Ui::FindDialog){    ui->setupUi(this);}FindDialog::~FindDialog(){    delete ui;}void FindDialog::on_pushButton_find_clicked(){    m_stru_message_info.str_message = ui->lineEdit->text();    m_stru_message_info.options = 0;    if(ui->checkBox_case_sensitive->isChecked())        m_stru_message_info.options = m_stru_message_info.options | QTextDocument::FindCaseSensitively;    if(ui->checkBox_whole_words->isChecked())        m_stru_message_info.options = m_stru_message_info.options | QTextDocument::FindWholeWords;    if(ui->checkBox_backward->isChecked())        m_stru_message_info.options = m_stru_message_info.options | QTextDocument::FindBackward;//    QString str_find_text = ui->lineEdit->text();//    emit SendFindText(str_find_text);    emit SendFindText(m_stru_message_info);}void FindDialog::on_pushButton_cancel_clicked(){    this->close();}


注意:这里传递了一个结构体。

public_define.h

#ifndef PUBLIC_DEFINE_H#define PUBLIC_DEFINE_Hstruct message_info{    QString str_message;    QTextDocument::FindFlags options;};#endif // PUBLIC_DEFINE_H


mainwindow.h

#include "finddialog.h"#include "public_define.h"public slots:    void ShowFindText(QString &str);    void ShowFindText(struct message_info &struct_message_info);private:    Ui::MainWindow *ui;    bool m_b_istitled;                                                                          //判断文件是否保存    QString m_str_current_file;                                                                 //当前文件名    FindDialog *m_p_obj_find_dialog;
mainwindow.cpp
void MainWindow::ShowFindText(message_info &struct_message_info){    if(!ui->textEdit->find( struct_message_info.str_message , struct_message_info.options ) )    {        QMessageBox::warning( this , tr("error") , tr("can not find %1").arg(struct_message_info.str_message));        m_p_obj_find_dialog->show();        return ;    }}void MainWindow::on_actionFind_triggered(){//    m_p_find_dialog->show();    m_p_obj_find_dialog->show();}MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    m_p_obj_find_dialog = new FindDialog(this);    connect(m_p_obj_find_dialog , SIGNAL(SendFindText(message_info&)) , this , SLOT(ShowFindText(message_info&)) );    m_str_current_file = tr("untitled.txt");    this->setWindowTitle( m_str_current_file);    m_b_istitled = false;}


注意:我没有把所有代码贴完。只是贴了相关代码。




方法二:直接在mainwindow中写代码添加dialog,让dialog,lineedit,pushbutoon成为mainwindow的类成员,而不是第一种方法中mainwindow和dialog平起平坐。

mainwindow.h

private:    Ui::MainWindow *ui;    bool m_b_istitled;                                                                          //判断文件是否保存    QString m_str_current_file;                                                                 //当前文件名    FindDialog *m_p_obj_find_dialog;//    QDialog *m_p_find_dialog;                                                                      //查找对话框//    QLineEdit *m_p_find_line_edit;                                                                 //查找单行文本控件//    QPushButton *m_p_find_push_button;                                                             //查找按钮对话框};


mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);//    m_p_find_dialog = new QDialog(this);//    m_p_find_line_edit = new QLineEdit(this);//    m_p_find_push_button = new QPushButton(this);//    QVBoxLayout *p_find_layout = new QVBoxLayout(m_p_find_dialog);//    m_p_find_push_button->setText(tr("find"));//    p_find_layout->addWidget(m_p_find_line_edit);//    p_find_layout->addWidget(m_p_find_push_button);//    m_p_find_dialog->setWindowTitle(tr("find"));//    connect(m_p_find_push_button , SIGNAL(clicked(bool)), this , SLOT(ShowFindText()) );    m_p_obj_find_dialog = new FindDialog(this);//    connect(m_p_obj_find_dialog , SIGNAL(SendFindText(QString &)) , this , SLOT(ShowFindText(QString&)) );    connect(m_p_obj_find_dialog , SIGNAL(SendFindText(message_info&)) , this , SLOT(ShowFindText(message_info&)) );    m_str_current_file = tr("untitled.txt");    this->setWindowTitle( m_str_current_file);    m_b_istitled = false;}
void MainWindow::ShowFindText(){    if(!ui->textEdit->find(m_p_find_line_edit->text ) )    {        QMessageBox::warning( this , tr("error") , tr("can not find %1").arg(struct_message_info.str_message));        m_p_obj_find_dialog->show();        return ;    }}


阅读全文
0 0