码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-17 14:55:55      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

嗯。。。这次接了个单

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

  

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

标签:

原文地址:http://www.cnblogs.com/magina888/p/4583139.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!