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

嗯。。。这次接了个单

要求图形界面,刚好可以巩固并学习下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等打包软件进行打包

  

时间: 2024-10-06 15:49:50

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

关于qt学习的一点小记录

今日为了应付学校作业要求 决定现学qt来制作界面 毕竟c++不像在这方面c#可以那么方便 qt主要依靠信号.槽来实现类似winform中的消息 鉴于要尽快做完,故而没有细看qt 只是大概了解了下界面的制作方法 所以依然还有不少问题 好了我先从qt设计器开始了. 嗯,很好用的界面编辑器..一目了然啊~~~ 遇到的问题有: 1.槽明明在窗口类声明了,可设计器还是找不到... 解决:这个应该还需要在某些地方增加点代码,毕竟我find了一下别人demo的槽函数名字,发现出现在了好几个地方 嗯..这次时间

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

java学习中,object 对象的使用(toString、equals、hashCode)(java 学习中的小记录)

java学习中,object 对象的使用(java 学习中的小记录)作者:王可利(Star·星星) object 对象(参考API学习) 重点掌握三个方法: 1.toString 返回该对象的字符串表示. 2.equals(object obj)指示其他某个对象是否与这个对象相等. 3.hashCode() 返回对象的哈希码. 详见代码的注释分析(一个是Person类重写方法,一个是Star类使用方法) Star类代码: 1 package study; 2 3 public class sta

java学习中,成员内部类、匿名内部类(java 学习中的小记录)

java学习中,成员内部类.匿名内部类(java 学习中的小记录)作者:王可利(Star·星星) 内部类: 一个类中定义另外一个类,这样的类叫内部类. 内部类的文件名:外部类名$内部类名.class    内部类分两种: 1.成员内部类 如何访问成员内部类:             方式1:外部类中定义一个方法来创建内部类对象,再通过对象进行访问.             方式2:可以直接在其他类中直接创建内部类这个对象,通过对象访问.用点语.                       格式:

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

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

java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常(java 学习中的小记录)

java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常(java 学习中的小记录)作者:王可利(Star·星星) 异常:(API 的 java.lang 有一个异常,有很多很多) 在Java程序中也会程序出现不正常的情况,这个就叫异常.     Java是面向对象的语言,任何事物都可以用类来描述,同样的异常也是一种事物.Java中提供了很多的异常类.     多个异常堆积起来,就是一个异常体系.   Throwable:是异常类的父类,超类.Exception 异常.error错误.

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

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

Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: 1 class Star8 2 { 3 public static void main(String[] args) 4 { 5 /* 空格 6 * 1 2*i-1 3 4-1 4-i 7 *** 3 2 4-2 8 ***** 5 1 4-3 9 ******* 7 0 4-4 10 */ 11 //第一层循环控制的是行数 12 for(int i = 1;i<=

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)作者:王可利(Star·星星) 接口(功能:用来添加拓展功能的) 例子:铅笔.带橡皮檫的铅笔. 两个功能:     1.写字......> 铅笔     2.擦字......> 橡皮擦 想法:定义一个铅笔类,定义一个橡皮擦类,定义一个带橡皮擦的铅笔类继承 铅笔类和橡皮擦类 但是java是单继承的.于是就有了解决的方法:接口(可以添加拓展功能) 如:一个铅笔类,给它添加一个接口给它一个拓展类(橡皮擦类) 接口的定义模式 用