在编写Qt程序的时候,我们常常需要通过对话框来获取用户的输入数据,比如通过文件对话框获取文件的路径,通过颜色对话框获取用户所选择的颜色,这些对话框的类都是Qt帮我们写好了的,调用相应函数就能直接返回用户的输入,比如颜色对话框QColorDialog中有一个静态函数getColor,我们直接调用该函数,便会弹出颜色对话框,等我们选择好颜色并确定,该函数就会返回一个QColor的对象,这个对象就包含了我们之前所选颜色的RGB值了。
然而,很多时候,我们需要创建自己的对话框,我们不能调用现成函数来获取用户输入,本文将提供两种方法,通过对话框来获取用户输入的案例。在此之前,我们先讨论一下显示对话框的两个函数,一个是show(),一个是exec()。show() 显示的是非模态窗口,不会阻塞程序的线程,因此如果你的对话框是创建在栈上,跳出作用域之后,对象便销毁了,因此你会发现对话框一闪而过;如果你用new关键字将对话框创建在堆上,跳出作用域之后对象不能被销毁,但是建立在堆上需要考虑及时释放内存的问题,以免造成内存泄漏。但是能够正常显示窗口不代表能够很方便地获取数据,show()不会阻塞线程,因此可能用户还没来得及输入数据,就已经执行之后的代码了。解决这个问题需要用到信号槽机制,具体解决方案会在下文详细讲解。exec()显示的是模态窗口,它开启了一个事件循环,会阻塞程序的线程,函数返回之后,我们直接可以获取对话框的数据。下面考虑这两种不同的对话框显示方式,提供两种不同的获取对话框数据的方法。
方法一
首先考虑简单的,使用exec()显示对话框。我们定义了一个主界面的类,叫MainWindow,界面包含一个名为btn的按钮(用于跳出对话框)和一个名为label的标签(用于显示从对话框获取的用户输入);我们还定义一个对话框类,界面包含一个名为lineEdit的单行文本框(用于接收用户输入),以及确定和取消按钮(这两个按钮是创建对话框的时候自动生成的)。两个界面如下图:
关键代码如下:
//in mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void showDialog