qinputdialog
qinputdialog 用于方便快捷地获取一个用户输入数据,支持整数 int、浮点数 double、文本 qstring 三种数据。按照 qinputdialog 内部的输入控件,又可以分为整数输入控件 qspinbox、浮点数输入控件 qdoublespinbox、单行文本输入控件 qlineedit、多行文本输入控件 qplaintextedit、组合框输入控件 qcombobox 等。qinputdialog 将这些常见输入控件包装成输入对话框形式,方便获取用户输入。
qinputdialog 可以作为自定义对话框对象使用,也可以使用静态函数直接弹窗获取输入。
qinputdialog 构造函数比较简单:
qinputdialog(qwidget * parent = 0, qt::windowflags flags = 0)
参数里可以指定父窗口指针和窗口标志位。
构建输入对话框之后,可以设置其输入模式:
void setinputmode(inputmode mode) //设置整数、浮点数或文本输入模式
inputmode inputmode() const //获取当前输入模式
输入模式枚举常量如下表所示:
我们下面按照输入控件的类型分别介绍 qinputdialog 功能,先介绍输入对话框的普通成员函数,最后介绍常用的静态成员函数。
(1)整数输入
qinputdialog 整数输入对话框如下图所示:
上图标题栏文本 title 为“设置整数”,对话框带的提示标签 label 为“请输入整数值”,两个按钮显示默认的“ok”和“cancel”文本。整数使用 qspinbox 获取整数,可以定制整数取值范围和旋钮步进,相关函数如下 表所示:
对话框处于显示状态,整数值变化时,触发信号:
void intvaluechanged(int value)
如果用户点击了“ok”按钮,对话框关闭,触发最终选择整数值的信号:
void intvalueselected(int value)
(2)浮点数输入
qinputdialog 浮点数输入对话框如下图所示:
上图标题栏文本 title 为“设置浮点数”,提示标签 label 的文本为“请输入浮点数值:”,浮点数旋钮框的小数点后面只显示了一位。详细的浮点数输入定 制函数如下表所示:
对话框处于显示状态,浮点数变化时,触发信号:
void doublevaluechanged(double value)
如果用户点击了“ok”按钮,对话框关闭,触发最终选择浮点数值的信号:
void doublevalueselected(double value)
(3)单行文本输入
qinputdialog 单行文本输入对话框如下图所示:
用户输入文本后点击“ok”按钮或者按 enter 键就会返回一行文本 qstring;如果用户点击“cancel”按钮或者按 esc 键,返回空字符串。单行文本输入相关函数如下:
文本回显模式就是 qlineedit::echomode 单行编辑器的枚举常量,如下表所示:
对话框处于显示状态,文本变化时,触发信号:
void textvaluechanged(const qstring & text)
如果用户点击了“ok”按钮,对话框关闭,触发最终输入文本的信号:
void textvalueselected(const qstring & text)
(4)组合框条目输入
qinputdialog 组合框条目输入对话框如下图所示:
组合框右边可以点击三角形图标,展开条目列表。默认情况组合框内嵌的编辑框是可以直接编辑文本的。组合框条目输入相关函数如下:
组合框获取的也是文本,所以其触发的信号与单行文本输入时的情况一样,也是 textvaluechanged() 和 textvalueselected() 。
(5)其他普通成员函数
输入对话框可以定制提示标签和两个按钮的文本,相关函数如下:
qstring labeltext() const //获取提示标签文本
qstring okbuttontext() const //获取“ok”按钮文本
qstring cancelbuttontext() const //获取“cancel”按钮文本
void setlabeltext(const qstring & text) //设置提示标签文本
void setokbuttontext(const qstring & text) //设置“ok”按钮文本
void setcancelbuttontext(const qstring & text) //设置“cancel”按钮文本
输入对话框也重载了基类的打开函数:
void open(qobject * receiver, const char * member)
该函数会一次性绑定信号到参数 receiver 对象的 member 槽函数,关联槽函数时,根据槽函数的参数自动判断使用输入对话框对应的信号:
①如果 member 槽函数第一个参数是 qstring,将 textvalueselected() 信号关联到槽函数。
②如果 member 槽函数第一个参数是 int,将 intvalueselected() 信号关联到槽函数。
③如果 member 槽函数第一个参数是 double,将 doublevalueselected() 信号关联到槽函数。
④如果 member 槽函数没有参数,将 accepted() 信号关联到槽函数。
对话框关闭时,自动解除上述信号和槽函数的关联。
输入对话框也有几个选项标志位,相关函数如下:
inputdialogoptions options() const //获取对话框选项
void setoptions(inputdialogoptions options) //设置对话框选项
void setoption(inputdialogoption option, bool on = true) //设置一个选项标志位
bool testoption(inputdialogoption option) const //测试一个选项标志位是否为 true
qinputdialog::inputdialogoptions 标志位枚举常量如下表所示:
对于 qinputdialog 自定义对话框,如果设置 qinputdialog::textinput 文本输入模式,那么默认采用单行编辑器输入文本,如果希望输入多行文本,那么还需要将选项标志位 qinputdialog::useplaintexteditfortextinput 设为 true,这样才会启用多行编辑器。
静态函数 getmultilinetext() 也会自动设置 qinputdialog::useplaintexteditfortextinput 标志位为 true ,启用多行编辑。多行编辑输入对话框如下图所示:
(6)静态成员函数
qinputdialog 五种输入控件对应五个静态函数:
①获取整数值
int getint(qwidget * parent, const qstring & title, const qstring & label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool * ok = 0, qt::windowflags flags = 0)
参数里 parent 是父窗口指针,title 为对话框标题栏文本,label 是提示标签的文本,value 是初始值,min 为整数范围下限,max 是整数范围上限,step 是旋钮框的步进,ok 指针用于指向表示点击“ok”或“cancel”的状态变量,flags 是窗口标志位。
②获取浮点数值
double getdouble(qwidget * parent, const qstring & title, const qstring & label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = 0, qt::windowflags flags = 0)
getdouble() 与 getint() 类似,只是把步进变量换成了小数点后的位数变量。
③获取单行文本
qstring gettext(qwidget * parent, const qstring & title, const qstring & label, qlineedit::echomode mode = qlineedit::normal, const qstring & text = qstring(), bool * ok = 0, qt::windowflags flags = 0, qt::inputmethodhints inputmethodhints = qt::imhnone)
gettext() 参数里 mode 是字符回显模式,text 是初始的文本,ok 指针用于指向表示点击“ok”或“cancel”的状态变量,flags 是窗口标志位变量,inputmethodhints 是输入方式提示,比如密码、时间、数字等输入类型提示。inputmethodhints 特性是从基类 qwidget 继承的,仅仅是提示功能,不会限制任何输入,一般可以忽略。
④获取多行文本
qstring getmultilinetext(qwidget * parent, const qstring & title, const qstring & label, const qstring & text = qstring(), bool * ok = 0, qt::windowflags flags = 0, qt::inputmethodhints inputmethodhints = qt::imhnone)
多行文本使用 qplaintextedit 输入多行文本,没有 qlineedit 控件的回显模式设置,其他参数与 gettext() 参数类似。
⑤获取组合框条目文本
qstring getitem(qwidget * parent, const qstring & title, const qstring & label, const qstringlist & items, int current = 0, bool editable = true, bool * ok = 0, qt::windowflags flags = 0, qt::inputmethodhints inputmethodhints = qt::imhnone)
getitem() 也是获取文本,只是用组合框保存多个文本条目,供用户选择或编辑。参数 items 是条目文本列表,current 是默认选中的条目序号,editable 表示组合框内嵌编辑器是否可以编辑文本,其他参数与 gettext() 参数类似。
#ifndef dialog_h
#define dialog_h
#include <qdialog>
#include<qpushbutton.h>
#include<qlineedit>
#include<qgridlayout>
#include<qinputdialog>
class dialog : public qdialog
{
q_object
public:
dialog(qwidget *parent = nullptr);
~dialog();
private:
qgridlayout *glayout;//定义布局
qpushbutton *inputstubtn;
qlineedit *inputstuline;
qpushbutton *inputnambtn;
qlineedit *inputnamline;
qpushbutton *inputsexbtn;
qlineedit *inputsexline;
qpushbutton *inputscrbtn;
qlineedit *inputsrcline;
private slots:
void modifystu();
void modifysex();
};
#include "dialog.h"
dialog::dialog(qwidget *parent)
: qdialog(parent)
{
resize(300,150);
setwindowtitle("标准对话框");
//布局
glayout=new qgridlayout(this);
inputstubtn=new qpushbutton;
inputstubtn->settext("学生学号:");
inputstuline=new qlineedit("20221010");
inputnambtn=new qpushbutton;
inputnambtn->settext("学生姓名:");
inputnamline=new qlineedit("颤三");
inputsexbtn=new qpushbutton;
inputsexbtn->settext("学生性别:");
inputsexline=new qlineedit("女");
inputscrbtn=new qpushbutton;
inputscrbtn->settext("学生分数:");
inputsrcline=new qlineedit("99");
glayout->addwidget(inputstubtn,0,0);
glayout->addwidget(inputstuline,0,1);
glayout->addwidget(inputnambtn,1,0);
glayout->addwidget(inputnamline,1,1);
glayout->addwidget(inputsexbtn,2,0);
glayout->addwidget(inputsexline,2,1);
glayout->addwidget(inputscrbtn,3,0);
glayout->addwidget(inputsrcline,3,1);
connect(inputstubtn,signal(clicked()),this,slot(modifystu()));
connect(inputsexbtn,signal(clicked()),this,slot(modifysex()));
}
dialog::~dialog()
{
}
void dialog::modifystu()
{
bool isbool;
qstring strtest=qinputdialog::gettext(this,"标准输入对话框","请输入学号:",
qlineedit::normal,inputstuline->text(),&isbool);
if(isbool&&!strtest.isempty()){
inputstuline->settext(strtest);
}
}
void dialog::modifysex()
{
qstringlist strsextext;
strsextext<<"男"<<"女";
bool isbool;
qstring strsexitem=qinputdialog::getitem(this,"标准输入","请选择",strsextext,0,false,&isbool);
if(isbool&&!strsexitem.isempty()){
inputsexline->settext(strsexitem);
}
}
解释:在头文件中定义一些按钮和输入栏,方便显示学生信息,在定义槽函数,可以根据自己的 想法来定义。用来触发一些事件
在源文件中:我们先初始化在头文件定义的一些量。
后面两个槽函数是一个对话框类(dialog)中的两个成员函数(modifystu和modifysex)的实现。这两个函数用于修改学生的学号和性别。
函数modifystu()使用了标准输入对话框(qinputdialog::gettext)来获取用户输入的学号。首先,它创建了一个布尔型变量isbool来判断用户是否点击了对话框的确定按钮。然后,使用qinputdialog::gettext函数弹出一个对话框,提示用户输入学号。对话框的标题为"标准输入对话框",默认输入框中显示的文本为inputstuline的文本。用户输入完毕后,将输入的学号赋值给strtest变量。最后,如果isbool为true且strtest不为空,则将inputstuline的文本设置为strtest。
函数modifysex()使用了标准输入对话框(qinputdialog::getitem)来获取用户选择的性别。首先,它创建了一个字符串列表strsextext,其中包含了"男"和"女"两个选项。然后,它创建了一个布尔型变量isbool来判断用户是否点击了对话框的确定按钮。接着,使用qinputdialog::getitem函数弹出一个对话框,提示用户选择性别。对话框的标题为"标准输入",选项列表为strsextext,初始选中项为索引0,用户只能选择一个选项。用户选择完毕后,将选择的性别赋值给strsexitem变量。最后,如果isbool为true且strsexitem不为空,则将inputsexline的文本设置为strsexitem。
运行结果:
感谢阅读!!!!
发表评论