QT编程

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");

显示如下:

xAxis.png

这里起止时间应为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=5int *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自动完成了一些字符串到字节数组的转换工作。

11.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容