龙空技术网

从零开始学Qt(42):进阶!自定义对话框

未来奇兵 624

前言:

当前咱们对“对话框确定按钮看不到内容”大体比较关切,看官们都需要剖析一些“对话框确定按钮看不到内容”的相关知识。那么小编也在网摘上收集了一些对于“对话框确定按钮看不到内容””的相关资讯,希望大家能喜欢,我们一起来了解一下吧!

在一个应用程序设计中,为了实现一些特定的功能,必须设计自定义对话框。自定义对话框的设计一般从QDialog继承,并且可以采用UI设计器可视化地设计对话框。对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。

本文通过示例来详细介绍步骤。主窗口采用 QTableWidget作为数据表格编辑器,并设计了1个对话框,用于设置表格行列数。该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。

创建主窗体界面

实例主窗口从QWidget继承,主窗口采用一个QTableWidget组件作为界面中心组件。添加一个按钮,用于调用自定义的对话框。完成后如下图所示。

创建自定义对话框界面

在项目主窗口建立后,单击Qt Creator的菜单项 “File”一“New File or Project”,选择Qt类别下的“Qt Designer Form Class”,创建可视化设计的对话框类。

在随后出现的向导里,选择窗口模板为Dialog without Buttons,并设置自定义对话框的类名为myDialog。系统自动生成myDialog.h,myDialog.cpp和myDialog.ui 3个文件。

myDialog对话框的界面设计在UI设计器里进行,放置界面组件并设置好布局,如下图所示。

对话框类的定义

设计myDialog对话框的界面时,在上面放置了2个QPushButton按钮,并分别命名为 btnOk和btnCancel,分别是“确定”和“取消”按钮,用于获取对话框运行时用户的选择。那么,用户获得用户操作的返回值呢?

在信号与槽编辑器里,将btnOk的clicked()信号与对话框的accept()槽关联,将btnCancel的clicked()信号与对话框的reject()槽关联即可,如下图所示。

单击“确定”按钮会执行accept()槽(或在代码里调用accept()槽函数也是一样的),这会关闭对话框(默认情况下,对话框只是被隐藏,并不被删除),并返回QDialog::Accepted作为exec()函数的返回值。

单击“取消”按钮会执行reject()槽函数,也会关闭对话框,并返回QDialog::Rejected作为exec()函数的返回值。

完成后的myDialog的类完整定义如下:

class myDialog : public QDialog{  Q_OBJECT  public:  explicit myDialog(QWidget *parent = nullptr);  ~myDialog();  int rowCount(); //返回对话框输入的行数  int columnCount();//返回对话框输入的列数  void setRowColumn(int row, int column);//初始对话框上两个 spinBox 的值  private:  Ui::myDialog *ui;};

在myDialog的类定义中定义3个public函数,用于与对话框调用者的数据交互。因为窗体上的组件都是私有成员,外界不能直接访问界面组件,只能通过接口函数访问。

下面是类的接口函数实现代码。在析构函数中弹出一个消息提示对话框,以便观察对话框是 何时被删除的。

myDialog::~myDialog(){  QMessageBox::information (this,"提示","设置表格行列数对话框被删除");  delete ui;}int myDialog::rowCount(){  //用于主窗口调用获得行数的输入值  return ui->spinBoxRow->value();}int myDialog::columnCount(){  //用于主窗口调用获得列数的输入值  return ui->spinBoxColumn->value();}void myDialog::setRowColumn(int row, int column){  //初始化数据显示  ui->spinBoxRow->setValue(row);  ui->spinBoxColumn->setValue(column);}
对话框的调用

下面是主窗口中的“设置行列数”按钮的响应代码,用于创建、显示对话框,并读取对话框上设置的行数、列数。

#include "mydialog.h"void Widget::on_pushButton_clicked(){  //模态对话框,动态创逢,用过后删除  myDialog *dlgTableSize=new myDialog(this);  Qt::WindowFlags flags=dlgTableSize->windowFlags();  dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);  dlgTableSize->setRowColumn (ui->tableWidget->rowCount(), ui->tableWidget->columnCount());  int ret=dlgTableSize->exec();// 以模态方式显不对话框,  if(ret==QDialog::Accepted)  { //OK按钮被按下,获取对话框上的输入,设置行数和列数    int cols=dlgTableSize->columnCount();    ui->tableWidget->setColumnCount(cols);    int rows=dlgTableSize->rowCount();    ui->tableWidget->setRowCount(rows);  }  delete dlgTableSize;}

从代码中可以看到,每次单击此按钮时,对话框都被重新创建。创建后用setWindowFlags()函数将对话框设置为固定大小,然后调用对话框的自定义函数setRowCount将主窗口tableWidget的现有的行数和列数显示到对话框上的两个SpinBox组件里。

调用对话框的exec()函数,以模态显示的方式显示对话框。模态显示方式下,用户只能在对话框上操作,不能操作主窗口,主程序也在此处等待exec()函数的返回结果。

当用户单击“确定”按钮关闭对话框后,exec()返回结果为QDialog::Accepted,主程序返回结果后,通过对话框的自定义函数columnCount()和rowCount()获得对话框上新输入的行数,然后设置为tableWidget的列数和行数。

最后使用delete删除创建的对话框对象,释放内存。所以,关闭对话框时,会出现myDialog析构函数里的消息提示对话框。

注意:在对话框上单击按钮或关闭对话框时,对话框只是隐藏(缺省的),没有从内存中删除。如果对话框一关闭就自动删除,则在后面调用对话框的自定义函数获得输入的行数和列数时会出现严重错误。

标签: #对话框确定按钮看不到内容