我们丰富Addressbook的例子,增加一个Find按键,可弹出一个dialog,参考:http://doc.qt.nokia.com/latest/tutorials-addressbook-part5.html ,http://doc.qt.nokia.com/latest/tutorials-addressbook-part6.html和http://doc.qt.nokia.com/latest/tutorials-addressbook-part7.html,学习下面的内容:
-
QDialog的使用方法。
-
QFileDialog的使用方法
- 二进制和文本的文件读写
- split,QRegExp,QStringList等相关String的使用方法
为此,我们增加FindDialg的类,继承QDialog。下图是主Window的界面,以及FindDialog的弹出界面。
我们增加一个头文件finddialog.h和源文件finddialog.cpp来处理弹框。请注意在*.pro文件中加入相关的文件,通过qmake重新生成Makefile。finddialog.h如下:
|
按Find按钮后弹框:
|
#ifndef WEI_FINDDIALOG_H
#define WEI_FINDDIALOG_H
#include <QDialog>
class QLineEdit;
class QPushButton;
class FindDialog : public QDialog
{
Q_OBJECT
public :
FindDialog(QWidget * parent = NULL);
QString getFindText();
public slots:
void findClicked();
private:
QPushButton * findButton;
QLineEdit * lineEdit;
QString findText;
};
#endif
我们看看finddialog.cpp文件:
#include <QtGui>
#include "finddialog.h"
FindDialog::FindDialog(QWidget *parent): QDialog(parent)
{
QLabel * findLabel = new QLabel(tr("Enter contact's name: "));
lineEdit = new QLineEdit;
findButton = new QPushButton(tr("&Find"));
findText = "";
QHBoxLayout * layout = new QHBoxLayout;
layout->addWidget(findLabel);
layout->addWidget(lineEdit);
layout->addWidget(findButton);
setLayout(layout);
setWindowTitle(tr("Find Contact"));
/* 我们在这里作两个test case。方式一:将findButton的clicked()信号连接两个slot函数,先是findClicked()然后是accept()。accept()是QDialog的一个函数,当QDialog hide的时候给出dialog的返回数值QDialog::Accepted。当我们处理了findClicked后,则依次调用accept(),这是dialog将会hide(注意在QT中不是关闭),并且返回一个resultcode:Accepted。这个处理关系如图所示
*/
connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
connect(findButton, SIGNAL(clicked()), this, SLOT(accept()));
//在Test case 2中我们注释此行。
}
void FindDialog::findClicked()
{
QString text = lineEdit->text();
if(text.isEmpty()){
QMessageBox::information(this,tr("Empty Field"), tr("Please enter a name."));
return; //在这个例子,如果是空的,执行完此,return后,调用accept,窗口会自行关闭
}else{
findText = text;
lineEdit -> clear();
//accept(); // Test Case2:由于处理findClicked后,没有下一步的accept,通过test2 我们可以比较了解信号依次出发的情况。
}
}
/*在这里,我们注意到,宁可增加一个public来读取属性, 也不将该属性设置为public,即使目前只提供读的功能,这是一种好的编写风*/
QString FindDialog :: getFindText()
{
return findText;
}
现在补充addressbook.h,如下:
... ...
#include "finddialog.h"
... ...
class AddressBook : public QWidget
{
... ...
public slots:
... ...
void findContact();
private:
... ...
FindDialog * dialog;
QPushButton * findButton;
};
... ...
补充addressbook.cpp,如下:
... ...
AddressBook :: AddressBook(QWidget * parent) : QWidget(parent)
{
... ...
findButton = new QPushButton(tr("&Find"));
findButton->setEnabled(false);
dialog = new FindDialog();
... ...
buttonLayout1->addWidget(findButton);
... ...
connect(findButton, SIGNAL(clicked()),this,SLOT(findContact()));
}
void AddressBook::updateUI(Mode mode){
... ...
case NavigationMode:
... ...
findButton -> setEnabled(!contacts.isEmpty());
... ...
}
void AddressBook::findContact()
{
dialog->show();
if(dialog->exec() == QDialog::Accepted){
QString contactName = dialog->getFindText();
if(contacts.contains(contactName)){
nameLine->setText(contactName);
addressText->setText(contacts.value(contactName));
}else{
QMessageBox::information(this,tr("Not Found"), tr("Sorry, %1 is not found").arg(contactName));
}
}
}
二进行的文件读写
我们进一步完善,增加两个button,saveButton和loadButton,将click()信号connect置saveToFile()和loadFromFile(),相关的updateUI修改方式就不在重复,对于一个button,我们还可以采用setToolTip鼠标放在上面,出现提示方式。
loadButton->setToolTip(tr("Load contacts from a file"));
saveButton->setToolTip(tr("Save contacts to a file"));
我们重点看看save和load,对应写文件和读文件。文件采用QFile,QFile是QIODevice的subclass。通过QFile来open一个文件,如果文件不存在,则创建这个文件。使用
QDataStream来从QIODevice中二进制读写数据。下面是写的例子:
//对于文件类型,假设Address Book类型有两种*.a和*.b,方式为Address Book(*.a *.b),如果多个文件类型,之间使用“;;”来分割
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Address Book"),"", tr("Address Book(*.abk);;All Files (*)"));
if(fileName.isEmpty())
return;
QFile file(fileName);
if(file.open(QIODevice::ReadOnly)){
QDataStream in(&file);
contacts.empty();
in >> contacts; //将in的内容导入contacts。}
}
下面是读的例子:
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Address Book"),"", tr("Address Book(*.abk);;All Files (*)"));
if(fileName.isEmpty())
return;
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly)){
QMessageBox::information(this,tr("Unable to open file!"), file.errorString());
return;
}
QDataStream out(&file);
out << contacts;
file.close();
在Tutorial的例子中我们发现没有加入close(),close是调用flush后close文件,必须加入的,否则容易出问题。
文本读写方式和String的一些高级用法
上面是二进制的读写,有时我们需要采用文本text的方式,我们在上面的例子中增加到处vCard格式,并将其保存。我们需要将名字name中区分firstName,llastName。相当于获取一个字符串用空格分隔的第一个字符串和最后一个字符串。
// 其中nameList是QStringList,相当于一个String数组来保存,用split来分开,第二个参数表示如果分割后,entry为空,忽略,例如我们使用;分割,如果有;;,则有一个空的entry,将这个忽略。用户的输入,可能中间隔一个空格,也可能隔两个空格,无论多少个空格我们都作为一个分割符号来处理。这里我们使用了QRegExp来处理。/s表示空格,+表示可以多个。
nameList = name.split(QRegExp("//s+"),QString::SkipEmptyParts);
firstName = nameList.first(); lastName = nameList.last();
对于文本文件的写,获得有效的QFile file后,如下操作:
QTextStream out(&file);
out << "BEGIN:VCARD" << "/n";
out << "VERSION:2.1" << "/n";
out << "N:" << lastName <<";" <<firstName << "/n";
... ... //根据vCard格式加入,此处略去
file.close();
对于close,在我们的实验中,似乎二进制的方式,如果忘记了问题还表示很大,但是文本方式就很有问题。我们编写了一个采用文本方式读文件的函数,如果在write后面(没有close)马上调用之前读函数,读出来为空,如果在write最后有close,则正常。所有我们应该在open之后,加入close。
相关链接:我的MeeGo/Moblin相关文章
分享到:
相关推荐
数据库课程设计数据库课程设计数据库课程设计数据库课程设计
外汇经纪CRM软件,全球前10强生产商排名及市场份额
BS EN 60068-2-5-2011.pdf
MS2磁化率系统操作手册
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文
自动化测试装置
大华网络硬盘录像机用户手册
大型民营企业数字化转型综合解决方案.pptx
2024年中国5G智能手机背光模组行业研究报告
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
用于海关申报商品编码/HS编码信息
奥维互动地图软件安装包
《统计与数据分析基础》02数据采集
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
BIM+ESE数字化:低碳园区智慧能源数字化管理解决方案.pptx
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
样例数据及详细介绍:https://blog.csdn.net/li514006030/article/details/138510754
此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。
德勤:2024年技术趋势报告.pdf
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。