• Qt (QInputDialog 、QMessageBox、QMessageBox)对话框实战


    目录

    一、QInputDialog 类(输入对话框)

    二、QMessageBox 类(消息框)

    三、QMessageBox 类(自定义消息框)


    一、QInputDialog 类(输入对话框)

    QInputDialog 是一个提供输入对话框的 Qt 类。它允许用户输入文本,并提供给用户选择可用选项的选项列表。QInputDialog 可以显示多种输入类型的对话框,例如:

    1. 文本输入框:允许用户输入文本;
    2. 整数输入框:仅允许用户输入整数;
    3. 浮点数输入框:仅允许用户输入浮点数;
    4. 列表框:显示可用选项的选项列表,用户可以从中选择一个选项。

    QInputDialog 通过静态函数调用。例如,要显示一个文本输入框,可以使用以下代码:

    QString text = QInputDialog::getText(this, "Input Dialog", "Enter your name:");

    此代码将显示一个对话框,提示用户输入文本,并将用户输入保存在 text 变量中。除了 getText() 函数之外,还有其他静态函数可用于显示整数和浮点数输入框以及列表框。

    案例分析:实现下图功能

    dialog.h

    1. #ifndef DIALOG_H
    2. #define DIALOG_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class Dialog : public QDialog
    9. {
    10. Q_OBJECT
    11. public:
    12. Dialog(QWidget *parent = nullptr);
    13. ~Dialog();
    14. private:
    15. QGridLayout *glayout;
    16. QPushButton *inputstudentnobutton;
    17. QLineEdit *inputstudentnobuttonLineEdit;
    18. QPushButton *inputstudentnamebutton;
    19. QLineEdit *inputstudentnamebuttonLineEdit;
    20. QPushButton *inputstudentsexbutton;
    21. QLineEdit *inputstudentsexbuttonLineEdit;
    22. QPushButton *inputstudentscorebutton;
    23. QLineEdit *inputstudentscorebuttonLineEdit;
    24. private slots:
    25. void modifystudentno();
    26. void modifystudentsex();
    27. };
    28. #endif // DIALOG_H

    dialog.cpp

    1. #include "dialog.h"
    2. Dialog::Dialog(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. resize(260,110);
    6. setWindowTitle("输入对话框测试");
    7. // 布局
    8. glayout=new QGridLayout(this);
    9. inputstudentnobutton=new QPushButton;
    10. inputstudentnobutton->setText("学生学号:");
    11. inputstudentnobuttonLineEdit=new QLineEdit("20220370218");
    12. inputstudentnamebutton=new QPushButton;
    13. inputstudentnamebutton->setText("学生姓名:");
    14. inputstudentnamebuttonLineEdit=new QLineEdit("林佳欣");
    15. inputstudentsexbutton=new QPushButton;
    16. inputstudentsexbutton->setText("学生性别:");
    17. inputstudentsexbuttonLineEdit=new QLineEdit("女");
    18. inputstudentscorebutton=new QPushButton;
    19. inputstudentscorebutton->setText("学生分数:");
    20. inputstudentscorebuttonLineEdit=new QLineEdit("99");
    21. glayout->addWidget(inputstudentnobutton,0,0);
    22. glayout->addWidget(inputstudentnobuttonLineEdit,0,1);
    23. glayout->addWidget(inputstudentnamebutton,1,0);
    24. glayout->addWidget(inputstudentnamebuttonLineEdit,1,1);
    25. glayout->addWidget(inputstudentsexbutton,2,0);
    26. glayout->addWidget(inputstudentsexbuttonLineEdit,2,1);
    27. glayout->addWidget(inputstudentscorebutton,3,0);
    28. glayout->addWidget(inputstudentscorebuttonLineEdit,3,1);
    29. connect(inputstudentnobutton,SIGNAL(clicked()),this,SLOT(modifystudentno()));
    30. connect(inputstudentsexbutton,SIGNAL(clicked()),this,SLOT(modifystudentsex()));
    31. }
    32. Dialog::~Dialog()
    33. {
    34. }
    35. void Dialog::modifystudentno()
    36. {
    37. bool isbool;
    38. QString strText=QInputDialog::getText(this,"标准输入对话框","请输入学号:",
    39. QLineEdit::Normal,inputstudentnobuttonLineEdit->text(),&isbool);
    40. if(isbool && !strText.isEmpty())
    41. {
    42. inputstudentnobuttonLineEdit->setText(strText);
    43. }
    44. }
    45. void Dialog::modifystudentsex()
    46. {
    47. QStringList strSexItems;
    48. strSexItems<<"男"<<"女";
    49. bool isbool;
    50. QString strsexItem=QInputDialog::getItem(this,"标准输入对话框",
    51. "请选择性别:",strSexItems,0,false,&isbool);
    52. if(isbool && !strsexItem.isEmpty())
    53. {
    54. inputstudentsexbuttonLineEdit->setText(strsexItem);
    55. }
    56. }

    main.cpp

    1. #include "dialog.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Dialog w;
    7. w.show();
    8. return a.exec();
    9. }

    二、QMessageBox 类(消息框)

    QMessageBox 类是一个交互式的对话框类,用于显示一个或多个按钮、图标和文本消息,以便用户根据需要进行选择。它是 Qt 中的一个标准对话框类,提供了许多方便的方法来创建、显示和处理对话框。

    QMessageBox 类的常用函数包括:

    1. QMessageBox():构造函数,创建一个空的 QMessageBox 对象。

    2. setText():设置消息对话框中的文本内容。

    3. setIcon():设置消息对话框中的图标。

    4. addButton():向消息对话框中添加按钮。

    5. exec():执行消息对话框,并返回用户选择的按钮 ID。

    使用 QMessageBox 类可以快速创建常见的对话框,如询问用户是否确定某个操作、提醒用户操作出错等。它是 Qt 应用中常用的基础对话框之一。

    案例分析:实现下图功能

    代码示例:

    dialog.h

    1. #ifndef DIALOG_H
    2. #define DIALOG_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class Dialog : public QDialog
    9. {
    10. Q_OBJECT
    11. public:
    12. Dialog(QWidget *parent = nullptr);
    13. ~Dialog();
    14. private:
    15. QGridLayout *glayout;
    16. QLabel *displabel;
    17. QPushButton *questionbutton; // 问题消息框命令按钮
    18. QPushButton *informationbutton; // 信息消息框命令按钮
    19. QPushButton *warningbutton; // 警告消息框命令按钮
    20. QPushButton *criticalbutton; // 错误消息框命令按钮
    21. QPushButton *aboutbutton; // 关于消息框命令按钮
    22. QPushButton *aboutqtbutton; //
    23. private slots:
    24. void displayquestionMsg();
    25. void displayinformationMsg();
    26. void displaywarningMsg();
    27. void displaycriticalMsg();
    28. void displayaboutMsg();
    29. void displayaboutqtMsg();
    30. };
    31. #endif // DIALOG_H

    dialog.cpp

    1. #include "dialog.h"
    2. Dialog::Dialog(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. setWindowTitle("消息框测试");
    6. resize(320,150);
    7. glayout=new QGridLayout(this);
    8. displabel=new QLabel("请你选择一个消息框");
    9. questionbutton=new QPushButton("questionMsg"); // 问题消息框命令按钮
    10. informationbutton=new QPushButton("informationMsg"); // 信息消息框命令按钮
    11. warningbutton=new QPushButton("warningMsg"); // 警告消息框命令按钮
    12. criticalbutton=new QPushButton("criticalMsg"); // 错误消息框命令按钮
    13. aboutbutton=new QPushButton("aboutMsg"); // 关于消息框命令按钮
    14. aboutqtbutton=new QPushButton("aboutQtMsg"); //
    15. glayout->addWidget(displabel,0,0,1,2);
    16. glayout->addWidget(questionbutton,1,0);
    17. glayout->addWidget(informationbutton,1,1);
    18. glayout->addWidget(warningbutton,2,0);
    19. glayout->addWidget(criticalbutton,2,1);
    20. glayout->addWidget(aboutbutton,3,0);
    21. glayout->addWidget(aboutqtbutton,3,1);
    22. connect(questionbutton,SIGNAL(clicked()),this,SLOT(displayquestionMsg()));
    23. connect(informationbutton,SIGNAL(clicked()),this,SLOT(displayinformationMsg()));
    24. connect(warningbutton,SIGNAL(clicked()),this,SLOT(displaywarningMsg()));
    25. connect(criticalbutton,SIGNAL(clicked()),this,SLOT(displaycriticalMsg()));
    26. connect(aboutbutton,SIGNAL(clicked()),this,SLOT(displayaboutMsg()));
    27. connect(aboutqtbutton,SIGNAL(clicked()),this,SLOT(displayaboutqtMsg()));
    28. }
    29. Dialog::~Dialog()
    30. {
    31. }
    32. void Dialog::displayquestionMsg()
    33. {
    34. displabel->setText("question QMessageBox");
    35. switch(QMessageBox::question(this,"Question消息框",
    36. "你是否想退出程序应用,请选择?",QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok))
    37. {
    38. case QMessageBox::Ok:
    39. displabel->setText("你选择questionMsg命令按钮当中的button/Ok!");
    40. break;
    41. case QMessageBox::Cancel:
    42. displabel->setText("你选择questionMsg命令按钮当中的button/Cancel!");
    43. break;
    44. default:
    45. break;
    46. }
    47. return ;
    48. }
    49. void Dialog::displayinformationMsg()
    50. {
    51. displabel->setText("information QMessageBox");
    52. QMessageBox::information(this,"Information消息框","Information消息框测试成功,大家可以自己描述");
    53. return ;
    54. }
    55. void Dialog::displaywarningMsg()
    56. {
    57. displabel->setText("warning QMessageBox");
    58. switch(QMessageBox::warning(this,"Warning消息框",
    59. "是否删除数据库sudent.mdb,请注意数据的操作安全?",
    60. QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,QMessageBox::Save))
    61. {
    62. case QMessageBox::Save:
    63. displabel->setText("你选择warningMsg命令按钮当中的button/Save!");
    64. break;
    65. case QMessageBox::Discard:
    66. displabel->setText("你选择warningMsg命令按钮当中的button/Discard!");
    67. break;
    68. case QMessageBox::Cancel:
    69. displabel->setText("你选择warningMsg命令按钮当中的button/Cancel!");
    70. break;
    71. default:
    72. break;
    73. }
    74. return ;
    75. }
    76. void Dialog::displaycriticalMsg()
    77. {
    78. displabel->setText("critical QMessageBox");
    79. QMessageBox::critical(this,"critical消息框","数据库文件备份错误,请重新检查?");
    80. return ;
    81. }
    82. void Dialog::displayaboutMsg()
    83. {
    84. displabel->setText("about QMessageBox");
    85. QMessageBox::about(this,"about消息框","测试Qt about消息框");
    86. return ;
    87. }
    88. void Dialog::displayaboutqtMsg()
    89. {
    90. displabel->setText("aboutQt QMessageBox");
    91. QMessageBox::aboutQt(this,"aboutQt消息框测试--罗小白的干爹");
    92. return ;
    93. }

    main.cpp

    1. #include "dialog.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Dialog w;
    7. w.show();
    8. return a.exec();
    9. }

    三、QMessageBox 类(自定义消息框)

    在 Qt 中,可以使用 QMessageBox 类创建标准的消息框,但是如果需要自定义消息框,可以通过以下步骤实现:

    1. 创建一个 QDialog 类型的窗口,该窗口将作为自定义消息框。
    2. 在窗口中添加 QLabel 控件用于显示消息文字。
    3. 在窗口中添加自定义按钮,如确定、取消等。
    4. 通过信号和槽连接自定义按钮的点击事件,以在用户点击按钮时执行相应的操作。
    5. 在需要使用自定义消息框的地方,实例化该 QDialog 类型的窗口并显示。

    案例分析:实现下图功能

    代码示例:

    dialog.h

    1. #ifndef DIALOG_H
    2. #define DIALOG_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class Dialog : public QDialog
    9. {
    10. Q_OBJECT
    11. public:
    12. Dialog(QWidget *parent = nullptr);
    13. ~Dialog();
    14. private:
    15. QLabel *labelmsg,*labeldispmsg;
    16. QPushButton *msgbutton;
    17. QGridLayout *glayout;
    18. private slots:
    19. void customMsg();
    20. };
    21. #endif // DIALOG_H

    dialog.cpp

    1. #include "dialog.h"
    2. Dialog::Dialog(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. setWindowTitle("自定义消息框测试");
    6. resize(260,90);
    7. glayout=new QGridLayout(this);
    8. labelmsg=new QLabel("自定义消息框");
    9. msgbutton=new QPushButton("测试操作");
    10. labeldispmsg=new QLabel("未测试状态");
    11. glayout->addWidget(labelmsg,0,0);
    12. glayout->addWidget(msgbutton,0,1);
    13. glayout->addWidget(labeldispmsg,1,0,1,1);
    14. connect(msgbutton,SIGNAL(clicked()),this,SLOT(customMsg()));
    15. }
    16. Dialog::~Dialog()
    17. {
    18. }
    19. void Dialog::customMsg()
    20. {
    21. QMessageBox cMsgBox;
    22. cMsgBox.setWindowTitle("zgl的消息框");
    23. // 添加按钮
    24. QPushButton *yes=cMsgBox.addButton("YES",QMessageBox::ActionRole);
    25. QPushButton *no=cMsgBox.addButton("NO",QMessageBox::ActionRole);
    26. // 添加图标
    27. cMsgBox.setIconPixmap(QPixmap("d:\\lspng.png"));
    28. cMsgBox.exec();
    29. // 判断用户点击按钮 yes no
    30. if(cMsgBox.clickedButton()==yes)
    31. {
    32. labeldispmsg->setText("用户点击YES按钮");
    33. }
    34. else if(cMsgBox.clickedButton()==no)
    35. {
    36. labeldispmsg->setText("用户点击NO按钮");
    37. }
    38. }

    main.cpp

    1. #include "dialog.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Dialog w;
    7. w.show();
    8. return a.exec();
    9. }
  • 相关阅读:
    el-table表格变更前后根据数据值改变背景颜色
    【C++项目】负载均衡oj
    LeetCode_数学分析_中等_754.到达终点数字
    python打包成可执行文件app(Mac版)
    近地面无人机植被定量遥感与生理参数反演
    jdbc连接oracle数据库
    匈牙利算法讲解
    MySQL更新锁表超时 Lock wait timeout exceeded
    和ChatGPT聊了一会天它的学习反映能力惊呆了我
    Lit(四):生命周期、使用 Shadow DOM
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/133849469