C++ Qt学习笔记(2)简易计算器设计(为计算器添加菜单功能)
Qt中的主窗口为建立桌面应用程序的用户提供了一个框架,Qt中提供了QMainWindow和一些相关的类共同完成主窗口的管理。Qt中的QWidget是一个最基本的窗口控件,只有一个最基本的窗口,其余什么也没有。而QMainWindow为用户提供了一个具有菜单,工具栏以及底部状态栏的窗口。
1. 菜单栏
Qt中的菜单栏主要由QMenu和QAction类来表示。QMenu表示菜单对象,QAction表示菜单按下的事件。例如新建一个QMainWindow项目:
通过双击“在这里输入”来添加菜单以及添加子菜单。例如添加文件菜单,需要输入文件(&F),&F称为加速键,表明程序在运行时可以按下ALT+F键来激活菜单,添加子菜单的时候,可能会由于Qt版本问题无法输入中文。解决方法:再别的地方写好,再复制粘贴到菜单栏里面即可 新建(&N) 打开(&O)。
在新建完成菜单之后,可以看到,在Qt中的Action编辑器中已经出现了两个菜单,
将菜单和相应的槽函数相连接,有两种实现方法:
1. 右击按钮,点击跳转到槽选项,Qt会自己创建相应的槽函数,编写业务代码即可
2. 在QMainWindow.h文件中自定义槽函数,然后通过connect函数将菜单与相应的槽函数相连。
private slots:void on_action_N_triggered();void on_action_O_triggered();
connect(ui->action_O, SIGNAL(triggered()), this, SLOT(on_action_O_triggered)); // 通过connect函数也可以连接
2. 工具栏
工具栏QToolBar类提供了一个包含一组控件,且可以移动的面板。在工具栏中,可以添加其他的窗口控件,例如可以添加弹出菜单以及非弹出菜单。
在工具栏中添加新的弹出式 的菜单,以及添加spinbox控件:
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->action_O, SIGNAL(triggered()), this, SLOT(on_action_O_triggered)); // 通过connect函数也可以连接// 添加工具栏内容 按钮类型QToolButton* toolbtn = new QToolButton(this);toolbtn->setText("Color");// 为按钮添加菜单QMenu* colormenu = new QMenu(this); colormenu->addAction("red");colormenu->addAction("pink");toolbtn->setMenu(colormenu);toolbtn->setPopupMode(QToolButton::MenuButtonPopup);// 将按钮添加到工具栏ui->mainToolBar->addWidget(toolbtn);// 将一个spinbox添加到工具栏QSpinBox* spinbox = new QSpinBox(this);spinbox->setMaximum(100);spinbox->setMinimum(0);spinbox->setValue(50);ui->mainToolBar->addWidget(spinbox);// 将新建按钮QAction添加到工具栏ui->mainToolBar->addAction(ui->action_N);
}
工具栏效果如图所示:
3.状态栏
状态栏QStatusBar提供了一个水平条控件,用于向用户显示状态信息。QMainWindow中提供一个默认的状态栏。
状态栏中的信息分为三类:
1.临时信息,如一般的提示性的信息
2. 正常信息:例如显示当前的页码以及行号‘
3. 永久信息:显示版本号或者日期
可以使用showMessage()函数显示临时信息,它会出现在状态栏的最左边。一般添加一个Qlabel到状态栏上显示正常信息,它也会出现在状态栏的左边,可能被临时信息覆盖。如果需要显示永久信息,则需要使用addPermanentWidget()添加一个类似于Qlabel的可以显示信息的控件,他会生成在状态栏的右边。
// 向状态栏中添加信息QLabel* normal_info = new QLabel(this);QLabel* permanent_info = new QLabel(this);normal_info->setText("Normal information");permanent_info->setText("Permanent infomation");// 向状态栏添加相应的控件ui->statusBar->addWidget(normal_info);ui->statusBar->addPermanentWidget(permanent_info);
如果需要显示提示信息,则需要调用:
ui->statusBar->showMessage("New file Created!"); // 显示提示信息
可以将提示信息的显示写入相应的槽函数中,例如为新建按钮添加提示信息:
void MainWindow::on_action_N_triggered()
{qDebug() << "The new file button pushed" << endl;ui->statusBar->showMessage("New file Created!"); // 显示提示信息
}
则在新建按钮按下后,会出现提示信息,覆盖掉正常信息,但是当进行别的操作的时候,提示信息会消失,显示正常的信息。
4. 对话框
对话框窗口是一种比较特殊的窗口,对话框窗口通常用来完成短小任务或者和用户进行简单交互的顶级窗口,QDialog是所有对话框窗口的基类,下面介绍几种标准的对话框:
1. 模态与非模态对话框
按照运行对话框时,是否还可以与该程序的其他窗口进行交互,对话框可以分为两类,模态和非模态。
例如:对于上述的open菜单,设计一个对话框,非模态对话框就是当对话框弹出时,用户任然可以和其他的窗口进行交互。模态对话框则不行,只有将对话框关闭,才可以和其他的对话框进行交互。
void MainWindow::on_action_N_triggered()
{qDebug() << "The new file button pushed" << endl;ui->statusBar->showMessage("New file Created!"); // 显示提示信息// 创建一个模态对话框QDialog* dialog_new = new QDialog(this);dialog_new->setModal(true);dialog_new->show();
}void MainWindow::on_action_O_triggered()
{// 创建一个非模态对话框QDialog* dialog_open = new QDialog(this);dialog_open->setModal(false); // 非模态dialog_open->show();// qDebug() << "The open file button pushed" << endl;
}
通过dialog的setModal()函数设置对话框是模态还是非模态。
2. 自定义对话框
上述的对话框都是直接使用了QDialog类,这样的对话框时是空白的,里面没有其他的东西,为了能够使用Qt Designer来设计对话框,则需要继承QDialog类来设计一个自定义的会话框。
选中项目->右击选择“添加文件”->Qt Designer界面类,界面类模板选择Dialog without buttons, 类名默认即可。创建成功后,会自动转到设计模式,就可以进行设计了。
继续选择:
创建完成后,跳转到设计界面,此时在生成.ui文件的同时,也生成了对应的.cpp以及.h文件。
例如可以在对话框中拖入两个按钮:
然后在diaog.h文件以及dialog.cpp文件中,将按钮与相应的槽函数绑定:
1. 在dialog.h中定义槽函数:
private slots:void dialog_btn_ok();
2. 在dialog.cpp中连接按钮信号和槽函数:
connect(ui->dialog_btn_ok, SIGNAL(clicked()), this, SLOT(dialog_btn_ok())); // 连接槽函数connect(ui->dialog_btn_cancel, SIGNAL(clicked()), this, SLOT(close())); // 关闭对话框
这样,就完成了对话框中信号和槽的连接。
在QMainWindow中调用设计的对话框:QMainWindow.cpp中需要include dialog.h文件即可
void MainWindow::on_action_O_triggered()
{Dialog* dialog_open = new Dialog(this);dialog_open->setModal(true);dialog_open->show();// qDebug() << "The open file button pushed" << endl;
}
效果如下所示:
3. 标准对话框:
Qt为用户提供了一些常用的对话框,同样他们也继承自QDialog类,并且增加了特定的功能,例如获取颜色以及显示特定信息等。下面分别介绍这些对话框。
首先需要将相应的头文件包含到程序中:
#include <QColorDialog> // 颜色
#include <QFontDialog> // 字体
#include <QMessageBox> // 消息
#include <QErrorMessage> // 错误信息
#include <QFileDialog> // 文件
#include <QInputDialog> // 输入
#include <QProgressDialog> // 进度
#include <QWizard> // 向导
在设计模式下,向QMainWindow中拖入按钮,并且修改按钮的属性和名称:
定义按钮对应的槽函数:
// 标准对话框void dialog_color(); // 颜色对话框void dialog_font(); // 字体对话框void dialog_info(); // 消息对话框void dialog_error(); // 错误消息对话框void dialog_file(); // 文件对话框void dialog_input(); // 输入对话框void dialog_progress(); // 进度对话框void dialog_navi(); // 向导对话框
连接按钮与对应的槽函数:
void MainWindow::connect_dialogs()
{connect(ui->btn_dialog_color, SIGNAL(clicked()), this, SLOT(dialog_color()));connect(ui->btn_dialog_error, SIGNAL(clicked()), this, SLOT(dialog_error()));connect(ui->btn_dialog_file, SIGNAL(clicked()), this, SLOT(dialog_file()));connect(ui->btn_dialog_font, SIGNAL(clicked()), this, SLOT(dialog_font()));connect(ui->btn_dialog_info, SIGNAL(clicked()), this, SLOT(dialog_info()));connect(ui->btn_dialog_input, SIGNAL(clicked()), this, SLOT(dialog_input()));connect(ui->btn_dialog_navi, SIGNAL(clicked()), this, SLOT(dialog_navi()));connect(ui->btn_dialog_progress, SIGNAL(clicked()), this, SLOT(dialog_progress()));}
1. 颜色对话框:
可以使用QColorDialog的静态方法getColor,这样不需要声明对象:
// 1. 颜色对话框
void MainWindow::dialog_color()
{// 使用QColorDialog直接显示对话框,无需创建对象QColor color = QColorDialog::getColor(Qt::red, this, "Color"); // 参数: 初始颜色 父窗口 窗口标题qDebug() << "color: " << color;
}
如果需要更加灵活的设置颜色对话框,可以通过创建对象来实现:
// 1. 颜色对话框
void MainWindow::dialog_color()
{QColorDialog* color_dialog = new QColorDialog(Qt::red, this);color_dialog->setOption(QColorDialog::ShowAlphaChannel); // 显示alpha通道color_dialog->exec();QColor color = color_dialog->currentColor(); // 获取当前的颜色qDebug() << "Color: " << color << endl;
}
颜色对话框如下图所示:
2. 错误消息对话框
错误消息对话框QErrorMessage类提供了一个现实错误消息的对话框,它的使用方法如下所示:
// 2. 错误消息对话框
void MainWindow::dialog_error()
{QErrorMessage* error_dialog = new QErrorMessage(this); // 创建对话框error_dialog->setWindowTitle("Error"); // 设置对话框标题error_dialog->showMessage("An operation error accured"); // 设置对话框的错误信息
}
错误消息对话框如下所示:
3. 文件对话框:
文件对话框QFileDialog为用户提供了一个允许用户选择文件或者文件夹的界面。使用方式如下所示:
// 3. 文件对话框
void MainWindow::dialog_file()
{// 获取一个文件名,可以使用静态方法getOpenFileName// 获取多个文件名,使用静态方法getOpenFileNames// 函数参数分别是:对话框的父窗口 对话框标题 打开时的默认路径 文件过滤器(Pictures格式需要加空格),以";;"进行分隔 QString file_name = QFileDialog::getOpenFileName(this, "File open", "D:", "Pictures(* png * jpg);;TXT(*txt)");qDebug() << "Filename is: " << file_name << endl;
}
对话框如下:
4. 字体对话框:
向用户提供一个可以选择字体的对话框:
// 4. 字体对话框
void MainWindow::dialog_font()
{bool ok = false; // 用来判断用户是否选择了字体QFont font = QFontDialog::getFont(&ok, this); // 获取字体if(ok){qDebug() << "Font: " << font << endl;ui->btn_dialog_font->setFont(font); // 将font按钮的字体改编为选择的字体}else{qDebug() << "Not select font" << endl;}}
字体对话框如下所示:
可以看到,在选择字体后,字体按钮所对应的字体发生了变化:
5. 消息对话框:
消息对话框提供一个模态的对话框来通知用户一些信息,或者向用户提出问题并获取答案,具体的使用如下所示:
// 5. 消息对话框
void MainWindow::dialog_info()
{// 提问对话框,用于和用户交互简单问题int ret1 = QMessageBox::question(this, "Question dialog", "Do u know Qt?", QMessageBox::Yes, QMessageBox::No);if(ret1==QMessageBox::Yes){qDebug() << "Very goood";}// 提示对话框int ret2 = QMessageBox::information(this, "Tip dialog", "This is a book about Qt", QMessageBox::Yes);if(ret2==QMessageBox::Yes){qDebug() << "This is a tip";}// 警告对话框int ret3 = QMessageBox::warning(this, "waring dialog", "You can not operate", QMessageBox::Abort);if(ret3==QMessageBox::Abort){qDebug() << "This is a warning" << endl;}// 严重错误对话框int ret4 = QMessageBox::critical(this, "criticalerror dialog", "An critical occured!", QMessageBox::YesAll);if(ret4==QMessageBox::YesAll){qDebug() << "Error happen" << endl;}QMessageBox::about(this, "about dialog", "Qt dialog object");
}
上面的实例中展示了不同的消息对话框,按照重要等级递进:
a1. 问题对话框:和用户进行简单的交互
a2. 提示对话框,对用户进行简单的提示
a3. 警告对话框,提示可能会 发生的错误
a4. 严重错误对话框,告知用户发生严重错误
a5.关于对话框
--------------------------------------------------------------------------------------------------------------------------------
6. 输入对话框:
输入对话框QInputDialog类用来提供一个输入对话框,用户可以输入单一的数值或者字符串。
// 6. 输入对话框
void MainWindow::dialog_input()
{bool ok;// 获取输入的文本信息// getText()参数 父窗口 标题 label 输入框 默认字符串 okQString name = QInputDialog::getText(this, "Input Dialog", "Name", QLineEdit::Normal, "Admin", &ok);if(ok){qDebug() << "name: " << name << endl;}// 获取输入的数值信息// getInt()参数:父窗口 标题 label 默认数值 最小值 最大值 步长 okint ret = QInputDialog::getInt(this, "Input Dialog", "age", 20, 10, 100, 1, &ok);if(ok){qDebug() << "Age: " << ret << endl;}// 获取输入的数值信息double salary = QInputDialog::getDouble(this, "Input Dialog", "Salary", 20000, 5000, 100000, 500.45, &ok);if(ok){qDebug() << "Salary: " << salary << endl;}// 相当于一个多选一的对话框,下拉的选择菜单QStringList items;items << "male" << "female"; // 对话框内容QString item = QInputDialog::getItem(this, "Input dialog", "Select sex", items, 0, true, &ok);if(ok){qDebug() << "Sex: " << item;}}
输入对话框可以实现用户输入字符串,数值,下拉菜单选择等。
a1. 输入字符串:
a2. 输入数值:
a3. 下拉菜单:
7. 向导对话框:
QWizard是向导对话框,它向用户提供了一个设计向导界面的框架,例如,安装软件以及创建项目的时候,就是典型的向导对话框。Qwizard是一个向导对话框的框架,它可以设计一个向导全部的功能函数,需要首先创建出向导页面WizardPage,然后将向导页面添加到向导对话框。
a1, 定义首先创建向导页面的函数:
private:// 创建导航页面QWizardPage* create_page1();QWizardPage* create_page2();QWizardPage* create_page3();// 创建导航页
QWizardPage* MainWindow::create_page1()
{QWizardPage* page = new QWizardPage(this);page->setTitle("Recommendation");return page;
}QWizardPage* MainWindow::create_page2()
{QWizardPage* page = new QWizardPage(this);page->setTitle("Custom choose infmation");return page;
}QWizardPage* MainWindow::create_page3()
{QWizardPage* page = new QWizardPage(this);page->setTitle("End");return page;
}
a2. 创建向导对话框:
// 7. 向导对话框
void MainWindow::dialog_navi()
{QWizard wizard(this); // 创建一个导航窗口对象wizard.setWindowTitle("Wizard dialog");wizard.addPage(create_page1()); // 添加页面wizard.addPage(create_page2());wizard.addPage(create_page3());wizard.exec();
}
向导对话框页面:
8. 进度条对话框:
对一个时间较长的操作提供时间反馈:
// 8. 进度对话框
void MainWindow::dialog_progress()
{QProgressDialog progress_dialog("File copy progress", "Cancel", 0, 5000, this);progress_dialog.setWindowTitle("Copy file");progress_dialog.show();for(int i=0; i<50000; i++){progress_dialog.setValue(i);QCoreApplication::processEvents(); // 避免长时间操作而使用户界面冻结if(progress_dialog.wasCanceled()){break;}}progress_dialog.setValue(50000);qDebug() << "copy finished" << endl;}
给app添加图标:
第一步;将图片转化为.ico文件:
网上的免费工具即可完成转换: http://www.bitbug.net/
第二步: 将.ico文件放入到目录中:
第三步:
在pro文件中,添加以下代码:
RC_ICONS += appico.ico
但是我的顿操作之后并没有显示,百度也没有解决,再查查看
------------------------------------------------------------------------------------------------------------------
C++ Qt学习笔记(2)简易计算器设计(为计算器添加菜单功能)相关推荐
- C++ Qt学习笔记 (1) 简易计算器设计
最近开始学习c++ qt, 按照教材上的例程设计一个简易的桌面计算器: Qt是一个基于C++语言的跨平台应用程序和UI开发框架,主要包含一个类库,和跨平台开发及国际化的工具,最初由挪威的Trollte ...
- Qt学习笔记-编写简易的音乐播放器
程序运行截图如下: 再次添加一个音乐并播放: 代码如下: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #inc ...
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- QT学习笔记(五):Qt5的8种标准对话框示例
QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...
- Qt 学习笔记(5)绘图 五子棋游戏
在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...
- QT学习笔记(摘抄)
QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
- Qt学习笔记之数据库
一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...
- Qt学习笔记之文件处理
Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...
最新文章
- day22-Model数据验证以及钩子
- 【初探移动前端开发02】移动设备的页面
- 主机无法连接虚拟机中的redis服务
- 我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
- java jigsaw_60秒内使用Java 9的Project Jigsaw的JavaFX HelloWorld
- 【计算机网络复习 数据链路层】3.6.2 以太网
- web-基础入门-web框架-web服务器-wsgi接口
- 不同组织物料类别差异列表
- hdu 1059 Dividing(多重DP)
- AI 重塑 IT 的 5 种方式
- 处理服务器故障的前5分钟(转)
- 世界级的安卓测试开发流!
- 临时邮箱email网址收集
- 单设施重心法选址matlab编程
- 【提升笔记本续航】WIN10笔记本打开电源选项中的处理器电源管理
- 股票模拟交易php,股票模拟图,股票交易记录生成器
- 区块链之搭建区块链平台及智能合约的编写
- SQL学习笔记(04)_JOIN
- 房屋租赁合同主要内容是那些
- 从Maya中把模型搬运至网页的过程
热门文章
- ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011
- k8s核心技术-Helm(快速部署应用)---K8S_Google工作笔记0046
- SpringCloud工作笔记049---nginx的安装及配置为简单的文件服务器
- 网站制作---科讯万能搜索系统的简单实用教程
- 堆内存里的各种奇怪填充值
- ERROR: Couldn’t connect to Docker daemon at http+docker://localunixsocket - is it running?
- 将多个集合合并成没有交集的集合
- 随想录(开源代码的学习方法)
- 基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统
- ie ajax异步缓存,IE下发送Ajax请求的缓存问题