嗯。。。这次接了个单

要求图形界面,刚好可以巩固并学习下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. JFrame编程

    最基础的窗口 public test1() { setTitle("test1"); setSize(300,300); //设置窗口大小 setLocation(300,300) ...

  2. log4j 突然不打印记录,提示:No appenders could be found for logge,处理方法

    log4j 一直都在使用正常,log4j.xml配置.代码都没有修改,突然不打印记录,出现下面提示: log4j:WARN No appenders could be found for logger ...

  3. pyqt node节点1

    #!/usr/bin/env python # coding: utf-8 from PyQt4.QtGui import * from PyQt4.QtCore import * rad = 5 c ...

  4. (转)iOS Wow体验 - 第二章 - iOS用户体验解析(1)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第一部分,其余章节将陆续放出.上一 ...

  5. docke 网络配置

    一,docker 的bridge模式是和vmware中的nat模式类似的,但是如果想要弄成和vmwae中的bridge怎么办呢? 说明,bridge模式获取的Ip是与宿主机的ip是出于同一个网段的. ...

  6. vsftp虚拟用户登录配置详解

    一.安装:1.安装Vsftpd服务:# yum install vsftpd 2.安装DB4部件包:这里要特别安装一个db4的包,用来支持文件数据库.# yum install db4-utils 二 ...

  7. eclipse项目转android studio详解

    第一步:项目导入 向AS中导入项目的方法有两种(其实是一种). 方法一:是在eclipse中先导出为gradle(如图1),然后打开AS,找到项目中的gradle文件,直接导入. 方法二:直接在AS中 ...

  8. JS高级程序设计学习笔记之JS事件(1)

    事件流 冒泡 定义:事件开始时由最具体的元素接收,然后逐级上传到较为不具体的节点.(IE9.FF.Chrome.Safari会将事件一直冒泡到window对象.IE5.5及其以下会跳过<html ...

  9. jQuery input -> file change事件bug

    由jQuery绑定类型为file的input控件的change事件,发现只能被触发一次,修改方法 --> 原始代码: $input.change(function() { // somethin ...

  10. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...