1. QT5显示中文乱码:
解决方法:
1.使用QStringLiteral
2.#pragma execution_character_set("utf_8")
升级到Qt5.x 之后,原先的中文乱码方法突然失灵,就找到下面两种解决方法
第一种:
先将cpp文件用Windows自带记事本打开,另存为UTF_8格式,再在代码中,遇到中文字符,使用QStringLiteral("中文")
进行修饰
第二种:
在头文件声明中加上
#prama execution_character_set("utf_8")
一切就ok了
2.QT中的&和tr("字符串")
函数tr()
的原型是QObject::tr()
,被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是国际化使用。如果想让你的程序实现国际化,那么就在用户所有可见的字符串处都使用QObject::tr()!但是我们在使用的过程中通常是使用tr(),而并非是 QObject::tr(),这是为什么呢?原来,tr()函数是定义在QObject里面的,所有使用了Q_OBJECT宏的类都自动具有tr()的函数。和connect函数一样,都是继承了QObject所以能够直接使用。
Qt中在按钮上显示字符'&'
1、通常使用含字符&
的字符串为按钮的显示名称,如果设置按钮的text为 &Cancel
,
即设置text, setText("&Cancel")
;或创建时 QPushButton* pushButton = new QPushButton (QObject::tr("&Cancel"))
;
Qt的编译器会将字符&
后的'C'在显示时下方多一下划线,表明'C'为该按钮的快捷键,通过"Alt+c"操作来实现对pushButton的点击。
2、有的时候,我们会有这种需求,想在按钮上或别的控件上以包括字符'&'为显示名如"Cancel&Exit",这样字符串中的'&'需要对其进行转义,
通常我们会想到使用"/"来实现,试过发现不行,后来,直接使用'&'来转义没想到出现了想要的效果。即tr("Cancle&&Exit")。
#include <QApplication>
#include <QtGui>
#include <QObject>
int main (int argc, char *argv[])
{
QApplication app (argc, argv);
QWidget *widget = new QWidget;
QHBoxLayout *mainLayout = new QHBoxLayout;
QString str = QObject::tr("&Cancle&&Exit");
QPushButton *pushButton = new QPushButton (str);
QObject::connect (pushButton, SIGNAL (clicked()), qApp, SLOT (quit ()));
mainLayout->addWidget (pushButton);
widget->setLayout (mainLayout);
widget->show ();
return app.exec ();
}
3.Object::tr("字符串")与QStringLiteral("字符串")的区别
Object::tr("字符串")
在2.中我们已经讲过,即为了实现字符串语言国际化。因tr()函数是定义在QObject里的,使得宏Q_OBJECT在被别的类引用时,可自动调用tr("字符串")转译函数
QStringLiteral
是Qt5中新引入的一个用来从"字符串常量"创建QString对象的宏(字符串常量指在源码中由""包含的字符串)。
3.0Plus 关于编码问题(Unicode与UTF-8)
首谈字节
:计算机唯一能识别的字符
ASCII码
:美国信息互换标准码(Ameraican Standard Code for Infomation Interchange)
Unicode
:国际标准编码
UTF-8
:更适宜的Unicode
Unicode符号范围 | UTF-8编码方式 |
---|---|
十六进制 | 二进制 |
4.C++ 时间构造器 setDateTimeForma
在customPlot(图表坐标轴)上绘制时间参数
customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
customPlot->xAxis->setDateTimeFormat("hh:mm:ss");
显示如下:
这里起止时间应为00:00:00 而非01:00:00,究其原因时间构造应为
HH:mm:ss
1.得到当前时间
注:
GetLocalTime得到的是本地时区的时间,而GetSystemTime是得到UTC时间
COleDateTime odt = COleeDateTime::GetCurrentTime();
QString* str = odt.Formate("%Y-%m-%d %H:%M:%S);
5.QWidget、QDialog与QMainWindow
6.C++中调用指针->
、指针*
与引用&
的区别
*****
与->
的区别****
*
含义有很多,其中之一就是声明指针。
->
就是用指针调用函数或者获取数据(通过指针调用指向对象的成员(函数))
CString strRelativePath_SymbolBar = pGlobalValueHandle->m_pGlobalValueApAll->chRelativePath;
pGlobalValueHandle是一个指针,其中有一个成员m_pGlobalValueApAll也是指针,m_pGlobalValueApAll中有一个成员chRelativePath时一个CString。
pGlobalValueHandle->m_pGlobalValueApAll就获得了m_pGlobalValueApAll
pGlobalValueHandle->m_pGlobalValueApAll->chRelativePath就获得了m_pGlobalValueApAll中的chRelativePath
*
与&
的区别
*
是取值运算符,对地址使用可以获得地址中储存的数值;对于指针a,*a
表示取a中的值
&
是地址运算符,对变量使用可以获得该变量的地址。 对于变量b,&b
表示取b的地址
在定义时,*
是一个标识符,声明该变量是一个指针,比如说int *p
; 那p就是一个指向int型的指针;
在调用时,*p
是指指针p指向的那个变量,比如说之前有int a=5
;int *p=a
;那么p的值是a的地址,也就是指针p指向a,*p
则等于a的值,即*p
=5。
而&
,则是引用,比如说有定义int a=5;再定义int b=&a;那么这里的b则引用a的值,即b=5
,而再给b赋值:b=10,a的值也会变为10。
*
和&
的区别,应该是针对函数定义里的参数
举几个简单例子:
先定义有int x=0;和int*p
=x;
1、若定义函数: void fun_1(int a){ a=5;} , 则调用:fun_1(x); 之后,x还等于0;因为fun_1函数只改变了形参a的值,a只是fun_1函数里的局部变量,调用fun_1(x)相当于是“a=x;a=5;”,x没变;
2、若定义函数:void fun_2(int &a){ a=5;} , 则调用:fun_2(x); 之后,x等于5;因为这里的a引用了x的值;
3、若定义函数:void fun_3(int *a
){*a
=5;} , 则调用:fun_3(p); 之后,x也等于5;因为fun_3函数的参数a是一个指针,相当于a=p;*a
则与*p
指向同一地址,改变*a
即改变*p
即x
7.Q_OBJECT宏的作用
The
Q_OBJECT
macro at the beginning of the class definition is necessary for all classes that define signals or slots
只有加入了Q_OBJECT,你才有可能使用QT中的 SIGNAL-SLOT(信号-槽)机制
class Widget:public QWidget
{
Q_OBJECT
public:
Widget(QWidget* parent = 0);
~Widget();
private slots:
void mountMessage();
};
Widget::Widget(QWidget* parent):QWidget(parent)
{
ui.setUi(this);
connect(ui.pushbutton,SIGNAL(clicked()),this,SLOT(mountMessage()));
//只有上面定义了Q_OBJECT才有效
}
8.Qt中QString arg()用法总结
1、QString::arg()
用字符串变量参数依次替代字符串中最小数值
cpp代码
QString i = "iTest"; // current file's number
QString total = "totalTest"; // number of files to process
QString fileName = "fileNameTest"; // current file's name
QString status = QString("Processing file %1 of %2: %3") .arg(i).arg(total).arg(fileName);
style="background-color: #ffffff;">
qDebug() << status ;
结果就是:"Processing file iTest of totalTest: fileNameTest"
First, arg(i) replaces %1. Then arg(total) replaces %2. Finally, arg(fileName) replaces %3.
2、QString::arg ( int a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' ) ) const
16进制输出:fieldWidth表示字符宽度,base表示进制,
cpp代码
QString str;
str = QString("Decimal 63 is %1 in hexadecimal").arg(63, 0, 16);
// str == "Decimal 63 is 3f in hexadecimal"
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
str = QString("%1 %L2 %L3")
.arg(12345)
.arg(12345)
.arg(12345, 0, 16);
// str == "12345 12,345 3039"
//16进制显示,就忽略%L3的L
8.Qt中QString与QByteArray的前世今生
QString
Qt则提供了自己的字符串实现:QString。QString以16位Uniode进行编码。我们平常用的ASCII等一些编码集都作为Unicode编码的子集提供。
同Java的String类类似,QString也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起,正像Java里面的操作一样。QString可以自动的对占用内存空间进行扩充,这种连接操作是恨迅速的。下面是这两个操作符的使用:
QString str = "User: ";
str += userName + "/n";
QString的append()函数则提供了类似的操作,例如:
str = "User: ";
str.append(userName);
str.append("/n");
语言中有printf()函数作为格式化输出,QString则提供了一个sprintf()函数实现了相同的功能:
str.sprintf("%s %.1f%%", "perfect competition", 100.0);
这句代码将输出:perfect competition 100.0%,同C语言的printf()一样。不过前面我们也见到了Qt提供的另一种格式化字符串输出的函数arg():
str = QString("%1 %2 (%3s-%4s)").arg("permissive").arg("society").arg(1950).arg(1970);
这段代码中,%1, %2, %3, %4作为占位符,将被后面的arg()函数中的内容依次替换,比如%1将被替换成permissive,%2将被替换成society,%3将被替换成1950,%4将被替换曾1970,最后,这句代码输出为:permissive society (1950s-1970s). arg()函数比起sprintf()来是类型安全的,同时它也接受多种的数据类型作为参数,因此建议使用arg()函数而不是传统的sprintf()
QByteArray
QByteArray字符数组
**QString和QByteArray之间的转换
第一种,数据流的方式,这里只说从QByteArray转向QString。
QByteArray encodedString = "xxx";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
第二种,常用的,网上看到的。
//常用参数类型:char *字符串, QByteArray字符数组, QString字符串
//需要转换:char * ---转--- QByteArray ---需要调用QByteArray类的构造函数
char* --------------QByteArray(const char)-----------> QByteArray
char* str; QByteArray byte(str);
char --------------QString(const char)-------------->QString
char* str; QString string(str);
QByteArray -------------data()-------------------->char
QByteArray byte; char* str = byte.data();
QByteArray ------------QString()------------------->QString
QByteArray byte;
QString string(byte);
QString --------------toAscii()--------------------> QByteArray
QString string;
QByteArray byte = string.toAscii();
QString -------------qPrintable()------------------>char*
QString string;
char* str = qPrintable(string);
9.QTreeWidget之删除控件及删除数据(涉及到数据是否完全删除)
void zbtx::delete_folder()
{
QTreeWidgetItem * current = ui.tree_zhibiao->currentItem();
if (!current)
return;
if (!current->parent())
return;
ui.tree_zhibiao->clearSelection();//<-亮点
current->parent()->removeChild(current);
}
删除选中的Item,及该Item中数据
10.QString 和QByteArray的区别
一、
Qt GUI API中使用Unicode类型的字符串类QString。使用Unicode的好处是可以支持更多的地区语言,ASCII是Uncode的子集。
QByteArray和QString的方法和属性相似,可以参考QString。另外有一些与QByteArray相关的非成员函数
二、
QByteArray就是一个字节数组。类似于unsigned char[],什么数据都能保存。
而QString是一个字符串,其内部其实也是unsigned char[],但是这个数组是用于保存unicode字符的数组。对QString进行操作的时候,是按照字符串的角度来进行调用的。QString自动完成了一些字符串到字节数组的转换工作。