嗯。。。这次接了个单
要求图形界面,刚好可以巩固并学习下QT。毫不犹豫的就接了
下面记录下出现的问题:
1. QWidget和QDialog
QDialog下的槽函数有accept()与reject()可以直接用
并且QDialog有exec() 这种方式显示窗口,是阻塞形的
而QWidget则只有show()要自己写阻塞
2. 窗口间通信
2.1 主窗口->子窗口
介个方法很多啦
我用的是直接传值给子窗口里的变量:
比如说:
子窗口有:
class changemsg : public QDialog { Q_OBJECT public: changemsg(QWidget *parent = 0); ~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 != -1) { 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 = 0); ~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 + 1); 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 + 1); 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等打包软件进行打包