初识QT

##QT入门##
今天尝试了一下用QT做图形化界面,结果比想象中的要简单许多,ui直接可以用Designer进行可视化设计,期间的事件也可以通过函数进行调用,复杂程度大大降低。。
比如添加一个按钮事件

在QTFace.h中添加:

public slots:
    void ClickButton1();//声明函数

然后再QTFace.cpp中添加

QTFace.cpp

#include "QTFace.h"
#include <qfiledialog.h>
#include <qmessagebox.h>//用到messagebox就要添加相应的头文件
void QTFace::ClickButton1()//connect中调用的函数设置
{
    //what you want to do

    QMessageBox::information(this, "My Tittle", "Hello World!");
    QString fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ", tr("Allfile(*.*);;mp3file(*.mp3)"));
    ui.pushButton->setText(tr("(adgkl;kj)"));

}

QTFace::QTFace(QWidget *parent)
    : QMainWindow(parent)

{
    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(ClickButton1()));//构造函数中添加此项,用于连接UI中的内容,相当于事件绑定

}

文件夹的选取代码:

QString fileName1 = QFileDialog::getExistingDirectory(this, tr("请选择数据源的文件夹"), "/home", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);


关于QT显示中文乱码的问题
需要强制转化为UTF-8的编码格式。

从VS2013开始就已经支持UTF-8的源码文件了
只用在工程里加入一句"#pragma execution_character_set(“UTF-8”)"即可


关于菜单栏中的时间绑定
菜单栏的每一个按键都有action故需要用action来绑定。
slot中的函数定义及实现和前面的实现方式相同

connect(ui.actionNew, SIGNAL(triggered()), this, SLOT(ClickactionNew()));//而且给的信号是triggered即被触发

QT中点击菜单打开弹框的写法
要建立新的QT5 DesingerClass
例:这里需要再在VS界面里面 (解决方案管理器->mydialog->Form Files->右键->添加->类->Qt5Classes->Qt5GuiClass->填写MainWindow2)并保存
在MainWindow中需添加

private://该栏目下新增下面这个
    MainWindow2 w2; 

public slots:  //该栏目下新增下面这个
    void showMainWindow2(); 
//CPP文件下
void QTFace::ClickactionNew()
{
    w2.show();
}
//信号槽部分不再叙述

QLineEdit禁止编辑

setFocusPolicy(Qt::NoFocus);

Designer下设置FocusPolicy为NoFocus即可

想让窗体最大化,只需要
  setWindowState(Qt::WindowMaximized);就行了

QT中在UI中调整界面后需要点击重新生成来使项目的某些文件的到改变
** QT 设置全局变量的方法。可以把它写入到文件里面去,然后在要调用的地方再调用出来**

QString img,source;    //将路径保存到文件
       img= ui.lineEdit->text();
       source = ui.lineEdit_source->text();
       QFile outFile("path.txt");
       outFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
       QTextStream out(&outFile);
       out << img<<"\r\n"<<source << endl;
       outFile.close();

       QFile infile("path.txt");
       QString img, source;    //将路径读出到项目
       infile.open(QIODevice::ReadOnly | QIODevice::Text);
       QTextStream instream(&infile);
       img = instream.readLine();
       source = instream.readLine();
       infile.close();

QT限制窗口最大化和改变大小
setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);
setFixedSize(this->width(), this->height());


二进制文件比较小巧,却不是人可读的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用QTextStream类。QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。另外,像 XML、HTML 这种,虽然也是文本文件,可以由QTextStream生成,但 Qt 提供了更方便的 XML 操作类,这里就不包括这部分内容了。
QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。QTextStream使用 16 位的QChar作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
QTextStream同QDataStream的使用基本一致,例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:

QFile data("file.txt");
if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
    QTextStream out(&data);
    out << "The answer is " << 42;
}

这里,我们在open()函数中增加了QIODevice::Truncate打开方式。我们可以从下表中看到这些打开方式的区别:
枚举值描述QIODevice::NotOpen未打开QIODevice::ReadOnly以只读方式打开QIODevice::WriteOnly以只写方式打开QIODevice::ReadWrite以读写方式打开QIODevice::Append以追加的方式打开,新增加的内容将被追加到文件末尾QIODevice::Truncate以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。QIODevice::Text在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\nQIODevice::Unbuffered忽略缓存我们在这里使用了QFile::WriteOnly | QIODevice::Truncate,也就是以只写并且覆盖已有内容的形式操作文件。注意,QIODevice::Truncate会直接将文件内容清空。
虽然QTextStream的写入内容与QDataStream一致,但是读取时却会有些困难:

QFile data("file.txt");
if (data.open(QFile::ReadOnly)) {
    QTextStream in(&data);
    QString str;
    int ans = 0;
    in >> str >> ans;
}

在使用QDataStream的时候,这样的代码很方便,但是使用了QTextStream时却有所不同:读出的时候,str 里面将是 The answer is 42,ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。还记得我们前面曾经说过,使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而文本文件则没有类似的操作。因此,使用文本文件时,很少会将其分割开来读取,而是使用诸如QTextStream::readLine()读取一行,使用QTextStream::readAll()读取所有文本这种函数,之后再对获得的QString对象进行处理。
默认情况下,QTextStream的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
stream.setCodec(“UTF-8”);
这样的函数进行设置。
另外,为方便起见,QTextStream同std::cout一样提供了很多描述符,被称为 stream manipulators。因为文本文件是供人去读的,自然需要良好的格式(相比而言,二进制文件就没有这些问题,只要数据准确就可以了)。
例如,我们想要输出 12345678 的二进制形式,那么可以直接使用

out << bin << 12345678;

就可以了。这等价于

out.setIntegerBase(2);
out << 12345678;

更复杂的,如果我们想要舒服 1234567890 的带有前缀、全部字母大写的十六进制格式(0xBC614E),那么只要使用

out << showbase << uppercasedigits << hex << 12345678;

即可。
不仅是QIODevice,QTextStream也可以直接把内容输出到QString。例如

QString str;  
QTextStream(&str) << oct << 31 << " " << dec << 25 << endl;

这提供了一种简单的处理字符串内容的方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值