QT中的小细节

一 .  QT4和QT5的区别(信号和槽):
1.  QT4:
connect(button,SIGNAL(pressed()),this,SLOT(close()));
/**
* 优点 :写法简单
* 缺点: SIGNAL(), SLOT()是两个宏,将函数转换为字符串
* 编译时不做错误检查,影响程序的健壮性
*/

2.  QT5
connect(button,&QPushButton::clicked,this,&Widget::close);
/**
* sender: 信号发出者
* signal: 触发的信号(标准,自定义)
* receiver: 接受者
* slot: 处理的槽函数(标准,自定义)
*/

3.  信号与槽,信号类比于短信,槽类比于接收短信的手机
/**
* 1. 信号:普通函数(signal:),只需要声明不需要实现
* 2. 槽函数:QT5类中的任意成员函数,静态函数,全局函数,lambda表达式
* 3. 信号和槽可以使用QT内部定义好的,也可以自定义
* 4. 信号和槽是没有返回值的,但是可以有参数
* 5. 信号和槽的参数列表顺序必须一致
* void signal(int, double, char);
* void slot(int, double, char);
* 6. 信号和槽的参数个数可以不一样
* 信号的参数个数可以大于槽函数参数的个数
* 槽函数个数不可以大于信号参数个数
*/

4.  信号槽的扩展
/**
* 1. 一个信号可以连接多个槽函数
* 2. 槽函数执行的顺序是随机的,不能控制
* 3. 信号可以连接信号
* 4. 信号草连接成功后,可以断开连接disconnect()
* 5. 槽函数可以是Lambl表达式
*/

 二 .   常用控件

1.  常用控件
Qt ui
ui->
ui_xxx.h

1) 按钮类
QPushButton
QToolButoon
QRadioButton
2) item
QListWidget
3) 容器类
QStackWidget
QWidget
QFrame
4) 编辑类
QComboBox
QLineEdit
QTextEdit
5) 显示类
QLable
QLcdNumber
QProgressBar

2) 布局
水平
垂直
网格
布局属性
大小策略
最小大小
最大大小
容器(分类)
弹簧

3) 自定义控件(提升)
a) ui的控件和自定义控件的父类(基类)要一样
b) 选中ui控件->提升

4) 常用事件处理
事件处理器
1) 都是虚函数(基类中定义QWiget QObiect)
2) 我们派生类(子类)只是重写这些虚函数(虚函数必须和基类中的虚函数一致)

QString s = "";
switch(e->modifies())
{
case Qt::ControlModifier:
s = "Ctrl+";
break;
case Qt::AltModifier:
s = "Alt+";
break;
}

switch(e->key)
{
case Qt::Key_Left:
s += "left_Key Press";
break;
}

三.   绘图

1. 在窗口中绘图,重写绘图事件,虚函数
void paintEvent(QPaintEvent *event) //绘图不一定要放在这个函数里,但是在窗口里面,必须放在这里
{
QPaintEvent p(this); //创建画家,下窗口上绘图
p.drawXXX();

p.drawPixmap(0, 0, width(), height(), QPixmap());
p.drawPixmap(x, 0, 80, 80, QPixmap);
p.drawImage(); //QImage
p.drawPicture(); //QPicture
p.drawLine();
p.drawPixmap(); //QBitmap: 黑白: 光标
}

x += 20;
if(x > width)
{
x = 0;
}

update(); //间接调用paintEvent()

2. QBitmap -> QPixmap

QBitmap 黑白色
QPixmap 彩色的

3. 绘图设备
QPixmap: 针对屏幕进行了优化,和平台相关,不能对图片进行修改(保存内容为图片)
QImage : 和平台无关,可以对图片进行修改,在线程中绘图(保存内容为图片)
QPicture : 保存绘图的状态(二进制文件) //QImage 和QPicture的操作是一样的

4. QPixmap -> QImage
QPixmap a;
a.toImage();

5. QImage -> QPixmap
QImage b;
QPixmap::fromImag(b);

6. 例子 

QPainter p;
QPicture pic;
p.begin(&pic);//指定绘图设备
//绘图动作
p.end();
pic.save("demo.aa");

QPicture temp;
temp.load("demo.aa");

7. 不规则窗口
1) 给窗口画一张背景图
2) 去边框
3) 设定属性(背景透明)
4) 移动坐标是相对屏幕而言

四.  文件操作

1. 基本操作

QFile file;
file.setFileName();
file.open();
file.write();
file.read();
file.close();

QFileInfo info;
info.size();
info.fileName();

QDataStream: //通过二进制的方法操作
QTxetStream: //通过文本方式操作(指定编码)
QBuffer: //内存文件

2.  文件读操作

void Widget::on_Button_read_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");

if(path.isEmpty() == false)
{
//文件对象
QFile file(path);

//打开文件: 只读的方式
bool isOK = file.open(QIODevice::ReadOnly);
if(isOK == true)
{
#if 0
//读文件: 默认只识别utf8编码
QByteArray array = file.readAll();

//显示到编辑区
ui->textEdit->setText(QString(array));
#endif

QByteArray array;
while(file.atEnd() == false)
{
//读一行
array += file.readLine();
}
ui->textEdit->setText(array);
}

//关闭文件
file.close();

}
}

3. 文件写操作

void Widget::on_Button_write_clicked()
{
QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");
if(path.isEmpty() == false)
{
QFile file;//创建文件对象
file.setFileName(path);

//打开方式: 只写方式
bool isOK = file.open(QIODevice::WriteOnly);
if(isOK == true)
{
//获取编辑区内容
QString str = ui->textEdit->toPlainText();

/**
写文件
*/

//第一种
//QString -> QByteArray
file.write(str.toUtf8());

// //第二种
// //QString -> c++ string -> char*
// file.write(str.toStdString().data());

// //转换为本地平台编码
// file.write(str.toLocal8Bit());

// //第三种
// //QString -> QByteArray
// QString buf = "123";
// QByteArray a = buf.toUtf8();//中文
// a = buf.toLocal8Bit();//本地编码

// //QByteArray -> char *
// char *b = a.data();

// //网络转换
// char *p = "abc";
// QString c = QString(p);

}

//关闭文件
file.close();
}
}

tips: 

设置整个文件的编码格式为utf-8
#pragma execution_character_set("utf-8")

原文地址:https://www.cnblogs.com/Jaime1106/p/9379336.html

时间: 2024-10-17 02:19:02

QT中的小细节的相关文章

注意编码工作中的小细节

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

Java中的小细节

1.访问权限 1.private 只有本类才能被访问 2.default(默认)只有本包中才能被访问 3.protected只有子类和本包才能被访问,可以跨包. 4.public 可以在所有类中被访问 2.Java命名规范 1.类.所有单词首字母大写 2.方法.第一个单词的首字母小写 3.属性.第一个单词的首字母小写 4.包名.所有单词小写 5.常量.所有单词的字母大写.final定义的 Java中的小细节,码迷,mamicode.com

装修中的小细节和冷知识

一般在装修完以后都会都会发现很多小毛病和不足之处,这是因为什么呢,就是因为很多小细节没有注意到,可别小看这些小细节有时候却能起到很大的作用,那下面我给大家说一些在装修中的冷知识,看完记得收藏. 1.玄关的收纳很重要,全家人的鞋子加在一起数量多,需要大的鞋柜才能装得下,我们可以利用墙面空间全部打上柜子,这样收纳空间要比买的多,也更加实用. 2.客厅插座要留足,电视墙要留足五个插座,3孔和2孔插座都要有,沙发墙可以做两个usb插座,方便给手机充电,要是留少了就会发现日后要接拖线板,危险不说更大大的影

关于if语句中的小细节

if语句都会用,但是有一些小细节并不容易被发现. 比如我们不应该写这样的代码: if(flag==0) flag为布尔变量,布尔变量的值为真或假,用0表示假,真是多少是不一样的. 所以我们应该避免将布尔变量与0或1这样的整型值进行比较. 那么我们也不应该写这样的代码: if(i) i为一个整型变量,但是写成上面那样就会被人误以为是布尔值,良好的编程习惯是这样的: if(i==0)或if(i!=0) 还有重要的一点是,我们不能将float型和double型数据与0这种整型变量进行==或!=. 因为

关于 JavaScript 中一个小细节问题 (在控制台中直接 {} 对象报错问题)

在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚好看到博客园有博友文章,顺便记录一下. 在 JavaScript 中, : 有三种作用,想必大家都知道,其一  三元表达式  true? A:B,其二 在 switch case 中 case 语句中会用到,其三 就是上图中,对象直接量表达式中. 其实 ,在 JS 中,: 还有一种用法,如下所示,内

不要忽视Web编程中的小细节

概述:长时间以来,我们创造了某些在构造和范围内用以提升网站易用性的约定和实践.然后在我们进行web编程的时候总有一些疏忽和纰漏.这里总结了一些web编程时容易出现的小错误,并给出了相应的补救方法,希望可以帮助提高网站的可用性.只要避免下列这些错误,网站的用户体验度就会大大提升. 错误一: 表单标签没有与相应字段相关联 利用 "for" 属性,使客户可以通过点击标签在表格内选择正确的输入字段.这对于复选框和单选字段来说就是要有更大的可点击区域. 错误二: Logo图表没有链接到主页 给l

Python正则表达式使用过程中的小细节

今天用Python写了个简单的爬虫程序,抓取虎扑篮球(nba.hupu.com)的首页内容,代码如下: 1 #coding:gb2312 2 import urllib2, re 3 webpage = urllib2.urlopen('http://nba.hupu.com') 4 text = webpage.read() 5 m = re.search('<a href=(.*) (.*)?>彩票</a>', text) 6 print m.group(1) 按照预想应该输出

apache配置中的小细节

configuration error: couldn’t perform authentication错误的解决办法 configuration error: couldn’t perform authentication. AuthType not set!: / apache 2.4中支持的 granted语法在低版本中不能使用 需要把下面的语句注释掉: # Require all granted 保存 重启apache 即可! .htaccess: Invalid command 'Re

C++11中的小细节--字符串的原始字面量

原始字面量很容易理解,即不进行转义的完整字符串. 最近看了看Python,其中讲到了原始字符串. Both string and bytes literals may optionally be prefixed with a letter ‘r’ or ‘R’; such strings are called raw strings and treat backslashes as literal characters. As a result, in string literals, ‘\U