`
javasogo
  • 浏览: 1821983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

QT(5)Dialog - Addressbook例子3

阅读更多

  我们丰富Addressbook的例子,增加一个Find按键,可弹出一个dialog,参考:http://doc.qt.nokia.com/latest/tutorials-addressbook-part5.htmlhttp://doc.qt.nokia.com/latest/tutorials-addressbook-part6.htmlhttp://doc.qt.nokia.com/latest/tutorials-addressbook-part7.html ,学习下面的内容:

  1. QDialog 的使用方法。
  2. QFileDialog 的使用方法
  3. 二进制和文本的文件读写
  4. 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相关文章

分享到:
评论

相关推荐

    dialog-1.2-5.20130523.el7.x86_64.rpm

    dialog-1.2-5.20130523.el7.x86_64.rpm,用于CentOS 7.7.1908 系统或者RedHat 7.X 系统 for x86_64使用

    前端项目-dialog-polyfill.zip

    在前端开发领域,`dialog-polyfill`是一个重要的工具,尤其对于那些需要向不支持HTML5 `dialog`元素的浏览器提供兼容性的项目来说。`dialog`元素是HTML5的一个新特性,它允许开发者创建模态对话框或者非模态对话框,...

    dialog-1.1-9.20080819.1.el6.i686.rpm

    dialog-1.1-9.20080819.1.el6.i686.rpm

    jquery-ui-dialog-demo

    `jquery-ui-dialog-demo` 是一个基于 jQuery UI 库的弹出窗口插件示例,它提供了丰富的交互式对话框功能,包括模拟原生 JavaScript 的 `alert` 和 `confirm` 对话框以及自定义的打开(open)模式。这个插件使得在...

    artDialog(6.0.0) dialog-plus.js (增加选项【esc】、【drag】,可控制是否点击键盘[Esc]键退出、是否允许用户拖拽)

    在artDialog(6.0.0)原始压缩版dialog-plus.js的基础上,增加了对话框的两个选项: 1、【esc】:是否点击键盘[Esc]键退出(默认true); 2、【drag】:是否允许用户拖拽(默认true);

    Dialog-based Language Learning.pdf

    dialog-based language learning, where supervision is given naturally and implic itly in the response of the dialog partner during the conversation. We study this setup in two domains: the bAbI dataset...

    Python库 | dialog-api-1.32.0.tar.gz

    5. **自定义扩展**:对于有特殊需求的开发者,dialog-api允许他们编写自己的对话策略和插件,以适应特定业务场景。 在1.32.0版本中,可能包含了如下改进和新特性: 1. **性能优化**:可能对关键算法进行了优化,...

    cx-dialog-close备份.png.zip

    很抱歉,根据您提供的信息,"cx-dialog-close备份.png.zip"是一个包含名为"cx-dialog-close备份.png"的图片文件的压缩包。这个标题和描述并没有直接揭示任何特定的IT知识点,而标签为空,也没有提供额外的上下文。...

    jQuery对话框Dialog弹出层插件演示与使用说明

    jQuery Dialog 是一个强大的...&lt;script src="https://code.jquery.com/jquery-3.x.y.min.js"&gt; &lt;!-- 引入 jQuery UI --&gt; &lt;link rel="stylesheet" href="https://code.jquery.com/ui/1.x.y/themes/base/jquery-ui.css"&gt; ...

    vue-dialog-drag-可拖动对话框-Vue.js开发

    vue-dialog-drag简单的可拖动对话框演示功能:拖放支持(仅用于拖放,不用于拖放)拖放区域组件“ Pin模式”,以锁定vue-dialog-drag简单的可拖动对话框演示功能:拖放支持(仅用于拖动,不用于放置)放置区域组件...

    dialog-1.3-13.20171209.el8.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    安卓Dialog对话框相关-项目通用Dialog.rar

    3. **创建Dialog** 创建Dialog通常分为几步: - 创建一个Dialog实例,如`new AlertDialog.Builder(context)`。 - 设置Dialog的属性,如标题、消息、按钮等,通过`setTitle()`, `setMessage()`, `...

    PyPI 官网下载 | dialog-api-1.73.0.tar.gz

    **PyPI 官网下载 | dialog-api-1.73.0.tar.gz** PyPI(Python Package Index)是Python开发者最常使用的软件包仓库,它提供了丰富的Python库和模块供全球用户下载和使用。在本案例中,我们关注的是一个名为`dialog-...

    QT自定义dialog提示窗

    在QT编程中,自定义对话框(Dialog)是一种常见的需求,它允许用户与应用程序进行交互,展示特定的信息或接收用户的输入。本项目“QT自定义dialog提示窗”着重于通过纯代码方式创建对话框,无需使用UI文件。下面将...

    sweet-alert-dialog-master.zip

    这个压缩包文件"sweet-alert-dialog-master.zip"包含了一个完整的项目源码,可能是为了方便开发者学习和参考Sweet Alert Dialog的实现方式。由于文件数量众多,无法逐一验证每个文件的可用性,所以用户需要自行调试...

    dialog-1.0.1.zip

    总结来说,"dialog-1.0.1.zip"提供了一套基于原生JavaScript的对话框解决方案,它专注于在IE5-IE11及Chrome浏览器上的兼容性和一致性,尤其是在IE6之外的浏览器中,能为用户带来一致的交互体验。开发者可以灵活地...

    react-native-android-location-services-dialog-box:React本机Android位置服务对话框

    React Native Android Location Services对话框 从Android位置服务打开对话框的React-Native组件安装大多是自动安装(推荐) yarn add react-native-android-location-services-dialog-box 要么npm install react-...

    QT的dialog.ui文件

    QT的dialog.ui文件

    android dialog------普通对话框

    下面是一个简单的使用`AlertDialog.Builder`创建普通Dialog的例子: ```java AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("普通对话框"); builder.setMessage("这是一个...

    dialog-polyfill:HTML对话框元素的Polyfill

    dialog-polyfill.js是&lt;dialog&gt;和&lt;form method="dialog"&gt;的polyfill。 查看! &lt;dialog&gt;是网页中弹出框的元素,包括模式选项,该选项将使页面的其余部分在使用过程中保持惰性。 在阻止用户交互直到用户给您答复...

Global site tag (gtag.js) - Google Analytics