嗯。。。这次接了个单

要求图形界面,刚好可以巩固并学习下QT。毫不犹豫的就接了

下面记录下出现的问题:

1. QWidget和QDialog

  QDialog下的槽函数有accept()与reject()可以直接用

  并且QDialog有exec() 这种方式显示窗口,是阻塞形的

  而QWidget则只有show()要自己写阻塞

2. 窗口间通信

  2.1 主窗口->子窗口

  介个方法很多啦

  我用的是直接传值给子窗口里的变量:

  比如说:

  子窗口有:

class changemsg : public QDialog
{
Q_OBJECT public:
changemsg(QWidget *parent = );
~changemsg();
person *pn = nullptr;
void setMsg(); private:
Ui::changemsg ui; public slots:
void rev_change();
};

  主窗口有:

void addressbookqt5vesion::rev_btn_change() {
int i = getObjFromtableSelected();
if (i != -) {
changemsg* chmsh = new changemsg(this);
chmsh->pn = &vt_pn[getObjFromtableSelected()];
chmsh->setMsg();
chmsh->exec();
}
}

在exec前先将参数传入即可

  2.2 子窗口->主窗口

  子窗口给主窗口传递可以用信号槽解决

  不过在这里因为我使用的还是直接调用子窗口的变量…

class addmsg : public QDialog {
Q_OBJECT public:
addmsg(QDialog *parent = );
~addmsg(); person *pn = nullptr;
person getPerson() { return *pn; } private:
Ui::addmsg ui; public slots:
void rev_addp();
};

  可以在主窗口的槽函数里写如下:

void addressbookqt5vesion::rev_btn_add() {
addmsg add;
if (add.exec() == QDialog::Accepted) {
if (add.pn != nullptr) {
vt_pn.push_back(*add.pn);
}
else {
QMessageBox::warning(this, tr("Add"),
tr("Please enter a name!."));
}
}

  直接通过指针pn来修改删除

3. QDataStream使用

  其中之一构造函数:

  QDataStream ( QIODevice * d )

  QIODevice描述了一个可以从中读数据和向它写数据的输入/输出介质。QFile类就是一个IO设备的例子。

  先上一段打开文件的代码:

  无用部分已删除

void addressbookqt5vesion::rev_openfile() {
QString path = QFileDialog::getOpenFileName(this,
tr("open file"),
".",
tr("Text Files(*.dat)"));
if (!path.isEmpty()) {
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr("Read File"),
tr("Cannot open file:\n%1").arg(path));
return;
}
//流读取文件
QDataStream ins(&file);
person pn;
while (!ins.atEnd()) {
ins >> pn.pid >> pn.name >> pn.ismale >> pn.type >> pn.date >> pn.phone >> pn.email;
char *ch = new char(MAXPERSONSIZE + );
ins >> ch;
person::recoverboolarr(ch);
delete(ch);
vt_pn.push_back(pn);
}
ishavecreatenewfile = true;
havecreatefilepath = path;
//允许保存
ui.actionSave->setEnabled(true);
ui.actionSaveAs->setEnabled(true); file.close();
}
else {
QMessageBox::warning(this, tr("Path"),
tr("You did not select any file."));
}
}

  关键代码:

ins >> pn.pid >> pn.name >> pn.ismale >> pn.type >> pn.date >> pn.phone >> pn.email;
char *ch = new char(MAXPERSONSIZE + );
ins >> ch;

  从这三行中我们可以知道:

  1、QDataStream 可以使用>> 和 << 流操作

  2、写入文件的数据类型可以得到保留

  3、允许多种类型的数据,这里有:QString、int、bool、char *

  (鉴于没有bool *的…故而我先将bool[] 转换为char *数组(以’0’,’1’为标志) 写入。读取时再转换回去即可)

  4、由于有数据类型的存储,故而存储文件无法用txt打开

  QDataStream 的 写入同理可知,不再赘述。

4. 工具条里添加图标

  如图:

  

  可以在QT设计器界面中找到:

  

  点击新建

  

  然后重要的一部。。将动作编辑器的一个条目拖动到窗口动作条上。。。

  (这一步我研究了好久才发现。。。原来可以拖!!!!!)

  然后给主窗口添加几个槽

  在信号槽编辑器将动作链接上槽即可

  点击信号一般是triggred()

  如图 :

  

5. VS+qt中给exe文件设置图标

  1.在项目文件夹里创建名为*.rc的文件,如myapp.rc。
  2.文件中写入IDI_ICON1 ICON DISCARDABLE "myapp.ico" 其中,myapp.ico为图标的文件名。
  3.将文件myapp.ico拷贝到项目文件夹内。
  4.在解决方案资源管理器中,右键点击项目,添加myapp.rc及myapp.ico。
  5.重新生成解决方案。

6. VS+QT打包发布

  1. 添加qt的bin/目录进系统path变量。很简单,在系统属性里设置,添加C:\Qt\Qt5.4.0\5.4\msvc2013_64\bin; 到系统path环境变量

  2. 在任意目录新建文件夹,把编译完成后的qt exe可执行程序拷贝过去。

    从命令行模式进入该文件夹,执行语句windeployqt xxxx.exe

      之后该工具会分析程序依赖性,自动添加必要dll文件至该目录。

  3. 使用NSIS等打包软件进行打包

  

关于qt学习的一点小记录(2)的更多相关文章

  1. 关于qt学习的一点小记录(1)

    今日为了应付学校作业要求 决定现学qt来制作界面 毕竟c++不像在这方面c#可以那么方便 qt主要依靠信号.槽来实现类似winform中的消息 鉴于要尽快做完,故而没有细看qt 只是大概了解了下界面的 ...

  2. 最近关于Qt学习的一点碎碎念

    最近关于Qt学习的一点碎碎念 一直在使用Qt,但是最近对Qt的认识更加多了一些.所以想把自己的一些想法记录下来. Qt最好的学习资料应该是官方的参考文档了.对Qt的每一个类都有非常详细的介绍.我做了一 ...

  3. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  4. Java 需要记得、了解的关键词 (Java 学习中的小记录)

    Java 需要记得.了解的关键词 (Java 学习中的小记录)     作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用

  5. Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)

    Java 逻辑运算符.位运算符.移位操作符  总结     作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...

  6. 关于Mybatis的一点小记录(parameterType)

    1.Mybatis的parameterType有两个比较常用的,一个是类的对象,还有一个就是Map,然后取值的方法也很简单: 基本数据类型:#{参数} 获取参数中的值 复杂数据类型:#{属性名} ,m ...

  7. Java学习中,常用的命令管理(Java 学习中的小记录)

    Java学习中,常用的命令管理      作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始  ---->所有程序---& ...

  8. 关于EF的一点小记录

    今日新闻:朝鲜要改革开放了!!!比你牛逼的人都在努力,你还有理由懒惰吗? 宇宙强大IDE配套的EF问题记录 今天做数据添加时,Id我设置为int类型了,结果在做Add操作时报的错让我摸不着头脑,后来问 ...

  9. try catch 一点小记录

    这两天做了新的需求,做完之后 在测试环境下 完美通关.之后部署到了预发布环境,然而怎么尝试都不通过.刚开始看到 预发布的一个配置文件错了.发邮件改了下,但是依然流程跑不通.之后 一步步在测试环境看代码 ...

随机推荐

  1. MyEclipse第一个Servlet程序 --解决Win7系统下MyEclipse与Tomcat连接问题

    前言 本文旨在帮助学习java web开发的人员,熟悉环境,在Win7系统下运行自己的第一个Servlet程序,因为有时候配置不当或系统原因可能会运行不成功,这给初学者带来了一定烦恼,我也是为此烦恼过 ...

  2. poj 2049 Let it Bead(polya模板)

      Description Cannery Row percent of the target audience insists that the bracelets be unique. (Just ...

  3. poj 2376 Cleaning Shifts(贪心)

    Description Farmer John <= N <= ,) cows to <= T <= ,,), the first being shift and the la ...

  4. Firefox历史版本下载

    http://ftp.mozilla.org/pub/firefox/releases/ http://ftp.mozilla.org/pub/firefox/releases/47.0.1/

  5. Android开发学习之Intent具体解释

    Intent简单介绍和具体解释:           Intent:协助应用间的交互与通信,Intent负责相应用中一次操作的动作.动作涉及的数据.附加数据进行描写叙述.               ...

  6. JSON解析---初识

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 全然独立于语言的文本格式 易于人阅读和编写 易于解析和生成 (网络传输速度快) JSON语法规则 数据在 ...

  7. Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

    这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用操心.这太简单了~! 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www ...

  8. Ubuntu 10.04下安装Opengl glx

    1.安装OpenGL Library sudo apt-get install build-essential 2. 安装OpenGL Utilities sudo apt-get install l ...

  9. RMAN连接及简单操作

    一.RMAN的进入与退出 1.启动RMAN并连接到本地目标数据库 C:\Users\Administrator>set oracle_sid=orcl(如果只有一个实例,则不需要指定,RMAN会 ...

  10. Eclipse汉化后怎么改回英文版 (中文 改 英文)

    Eclipse汉化后怎么改回英文版(可切换中英文) 很多朋友将MyEclipse汉化后还想改回英文的,其实只要修改MyEclipse的配置文件就可以了,这里我以MyEclipse7.0为例演示一下如何 ...