浙江华临建设集团有限公司网站,能源建设网站,做微课常用的网站有哪些,网站内部搜索怎么做Qt 是一个跨平台C图形界面开发库#xff0c;利用Qt可以快速开发跨平台窗体应用程序#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置#xff0c;实现图形化开发极大的方便了开发效率#xff0c;本章将重点介绍自定义Dialog组件的常用方法及灵活运用。
在…Qt 是一个跨平台C图形界面开发库利用Qt可以快速开发跨平台窗体应用程序在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置实现图形化开发极大的方便了开发效率本章将重点介绍自定义Dialog组件的常用方法及灵活运用。
在之前的文章中笔者已经为大家展示了默认Dialog组件的使用方法虽然内置组件支持对数据的输入但有时候我们需要一次性输入多个数据此时如果之使用默认模态对话框似乎不太够用此时我们需要自己创建一个自定义对话框需要说明的是此类对话框也是一种窗体所以可以在其上面放置任何通用组件以实现更多复杂的开发需求。
自定义对话框需要解决的问题是如何让父窗体与子窗体进行数据交换要实现数据的交换有两种方式第一种方式是通过动态加载模态对话框当用户点击确定后通过GetValue()来拿到数据而第二种方式则是通过发送信号的方式将数据投递给父窗体这两种方式都可以读者可根据自身需求来选择不同的通信方式。
1.1 使用模态对话框传值
首先我们需要创建一个自定义对话框在Qt中创建对话框很容易具体创建流程如下所示
选择项目 - AddNew - QT - Qt设计师界面类 - 选择DialogWithoutButtons - 命名为Dialog保存 此时直接点击下一步按钮并选中Forms/dialog.ui界面编辑菜单在编辑栏中我们分别增加一个LineEdit编辑框以及两个PushButton按钮组件将第一个组件命名为BtnOk将第二个组件命名为BtnCancel界面如下所示 当做完页面布局后其次我们还需要在Dialog.ui组件上增加两个信号分别是点击和关闭并将信号关联到两个槽函数上其信号应该写成如下图所示。 如上图accept() 是 QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的接受accept操作通常用于模拟用户点击对话框的“确定”按钮。同样的reject() 也是 QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的拒绝reject操作通常用于模拟用户点击对话框的“取消”按钮。
接着我们点开模态对话框的dialog.cpp对话框类其类内需要定义两个成员函数它们的功能如下
第一个 GetValue() 用来获取当前编辑框内的数据并将数据返回给父窗体。第二个 SetValue() 用来接收传入的参数并将此参数设置到自身窗体中的编辑框内。
#include dialog.h
#include ui_dialog.hDialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui-setupUi(this);
}// 用于MainWindow获取编辑框中的数据
QString Dialog::GetValue()
{return ui-lineEdit-text();
}// 用于设置当前编辑框中的数据为MainWindow
void Dialog::SetValue(QString x)
{ui-lineEdit-setText(x);
}Dialog::~Dialog()
{delete ui;
}接着我们来看一下MainWindow函数中是如何接收参数的对于主窗体来说当用户点击on_pushButton_clicked()按钮时我们需要动态将自己创建的Dialog加载读取出主窗体编辑框内的值并设置到子窗体内当用户按下QDialog::Accepted时则是获取子窗体内的值此时通过调用ptr-GetValue()子窗体的成员函数来返回一个字符串并将其设置到父窗体的编辑框内主函数代码如下所示
// 首先要包含Dialog对话框类
#include dialog.h#include iostream
#include QDialogMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui-setupUi(this);ui-lineEdit-setEnabled(false);ui-lineEdit-setText(hello lyshark);
}MainWindow::~MainWindow()
{delete ui;
}// 按钮点击后执行
void MainWindow::on_pushButton_clicked()
{// 创建模态对话框Dialog *ptr new Dialog(this); // 创建一个对话框Qt::WindowFlags flags ptr-windowFlags(); // 需要获取返回值ptr-setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小// 读取MainWindows参数并设置到DialogQString item ui-lineEdit-text();ptr-SetValue(item);int ref ptr-exec(); // 以模态方式显示对话框if (refQDialog::Accepted) // OK键被按下,对话框关闭{// 当BtnOk被按下时,则设置对话框中的数据QString the_value ptr-GetValue();std::cout value the_value.toStdString().data() std::endl;ui-lineEdit-setText(the_value);}// 删除释放对话框句柄delete ptr;
}至此就实现了参数的子窗体传递到父窗体如下图所示 2.1 使用信号传值
对于信号传值我们需要在dialog.h头文件中增加sendText()信号以及on_pushButton_clicked()槽函数的声明部分如下所示
// 定义信号(信号只需声明无需实现)
signals:void sendText(QString str);
private slots:void on_pushButton_clicked();而在dialog.cpp实现部分我们首先需要将子窗体中的按钮组件绑定到onBtnClick()槽函数上面当需要发送数据时直接通过调用emit sendText触发信号并携带子窗体中send_data的数据
#include dialog.h
#include ui_dialog.hDialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui-setupUi(this);// 连接pushButton到onBtnClick上connect(ui-pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
}Dialog::~Dialog()
{delete ui;
}// 发送信号到MainWindow
void Dialog::on_pushButton_clicked()
{QString send_data ui-lineEdit-text();emit sendText(send_data);
}接着是在mainwindow.h头文件定义中新增槽函数receiveMsg()函数用来接收信号的传值。
private slots:// 定义槽函数void receiveMsg(QString str);void on_pushButton_clicked();在mainwindow.cpp实现部分接收到信号后的槽函数receiveMsg其内部可以直接将参数设置到父类窗口的lineEdit组件上而当on_pushButton_clicked按钮被点击是我们只需要加载自己的子窗体并Connect链接槽函数receiveMsg上面当做完这一切之后再通过subwindow-show()让子窗体显示出来。
#include mainwindow.h
#include ui_mainwindow.h#include dialog.h
#include QDialogMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{ui-setupUi(this);ui-lineEdit-setEnabled(false);
}// 接收信号并设置到LineEdit上
void MainWindow::receiveMsg(QString str)
{ui-lineEdit-setText(str);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog *subwindow new Dialog(this);// 当收到sendText信号时使用receiveMsg槽函数处理connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));subwindow-show();
}当然此类对话框是非模态的读者可以拖动父对话框而由于是信号控制所以当发送参数到父窗体后子窗体并不会立即关闭如下图所示