Qt浅谈之总结(整理)

来源 http://blog.csdn.net/taiyang1987912/article/details/32713781

一、简介

QT的一些知识点总结,方便以后查阅。

二、详解

1、获取屏幕的工作区的大小

  1. {
  2. //获取屏幕分辨率
  3. qDebug()<< "screen width:"<<QApplication::desktop()->width();
  4. qDebug()<< "screen height:"<<QApplication::desktop()->height();
  5. //下面方法也可以
  6. qDebug()<< "screen width:"<<qApp->desktop()->width();
  7. qDebug()<< "screen height:"<<qApp->desktop()->height();
  8. //获取客户使用区大小
  9. qDebug()<< "screen avaliabe width:"<<QApplication::desktop()->availableGeometry().width();
  10. qDebug()<< "screen avaliabe heigth:"<<QApplication::desktop()->availableGeometry().height();
  11. //获取应用程序矩形大小
  12. qDebug()<< "application avaliabe width:"<<QApplication::desktop()->screenGeometry().width();
  13. qDebug()<< "application avaliabe heigth:"<<QApplication::desktop()->screenGeometry().height();
  14. }

移动到窗口中央:

move((QApplication::desktop()->width() - width())/2,  (QApplication::desktop()->height() - height())/2);

全屏设置:

setWindowState(Qt::WindowFullScreen);

2、设置应用程序图标

  1. {
  2. QIcon icon;
  3. icon.addPixmap(QPixmap(QString::fromUtf8(":/images/logo.png")), QIcon::Normal, QIcon::Off);
  4. win->setWindowIcon(icon);
  5. win->setIconSize(QSize(256, 256));
  6. }

3、显示图片Label

  1. {
  2. QLabel *logoLabel;
  3. logoLabel = new QLabel();
  4. logoLabel->setObjectName(QString::fromUtf8("logolabel"));
  5. logoLabel->setGeometry(QRect(160, 110, 128, 128));
  6. logoLabel->setPixmap(QPixmap(QString::fromUtf8(":/images/logo.png")));
  7. logoLabel->setScaledContents(true);
  8. }

4、字体更改

  1. {
  2. QFont font;
  3. font.setPointSize(40);
  4. font.setBold(true);
  5. font.setWeight(75);
  6. QLabel *fontLabel = new QLabel();
  7. fontLabel->setFont(font);
  8. }

5、文本颜色更改

  1. void Widget::changeColor(QWidget *window, QColor color)
  2. {
  3. QPalette *palette = new QPalette();
  4. palette->setColor(QPalette::Text, color);
  5. window->setPalette(*palette);
  6. delete palette;
  7. }

6、时间日期转QString

  1. QString date_str = QDate::currentDate().toString(QString("yyyyMMdd")); //"yyyyMMdd"为转换格式,该格式转换后日期如"20121205"
  2. QString time_str = QTime::currentTime().toString(QString("hhmmss")); //"hhmmss"为转换格式,该格式转换后时间如"080359"

7、Qt界面风格

  1. qApp>setStyle(new QPlastiqueStyle); //在window中main函数中使用这句话会让界面快速的变得好看。

8、qobject_cast用法

函数原型:

T qobject_cast (QObject * object)

该方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0。

使用场景:

当某一个Object emit一个signal的时候(即sender),系统会记录下当前是谁emit出这个signal的,所以在对应的slot里就可以通过 sender()得到当前是谁invoke了slot。有可能多个 Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理.

在槽函数中:

QPushButton *button_tmp = qobject_cast<QPushButton *>(sender());  //信号的对象,向下转型为按钮类型

9、Qslider进入显示

  1. {
  2. slider = new QSlider;
  3. slider->setRange(0,100);
  4. slider->setTickInterval(10);
  5. slider->setOrientation(Qt::Horizontal);
  6. slider->setValue(100);
  7. slider->setVisible(false);
  8. connect(slider,SIGNAL(valueChanged(int)),this,SLOT(slotChanged(int)));
  9. }
  10. void PicTrans::enterEvent ( QEvent * )
  11. {
  12. slider->setVisible(true);
  13. }
  14. void PicTrans::leaveEvent(QEvent *)
  15. {
  16. slider->setVisible(false);
  17. }

进入slider显示,离开slider隐藏。

10、Qt不重复随机数

  1. {   //qt
  2. QTime time; time= QTime::currentTime();
  3. qsrand(time.msec()+time.second()*1000);
  4. qDebug() << qrand() % 100; //在0-100中产生出随机数
  5. }
  1. {   //c语言
  2. srand(unsigned(time(0)));
  3. int number = rand() % 100; /*产生100以内的随机整数*/
  4. }

11、QSettings保存窗口状态

  1. void
  2. Settings::readSettings()
  3. {
  4. QSettings setting("MyPro","settings");
  5. setting.beginGroup("Dialog");
  6. QPoint pos = setting.value("position").toPoint();
  7. QSize size = setting.value("size").toSize();
  8. setting.endGroup();
  9. setting.beginGroup("Content");
  10. QColor color = setting.value("color").value<QColor>();
  11. QString text = setting.value("text").toString();
  12. setting.endGroup();
  13. move(pos);
  14. resize(size);
  15. QPalette p = label->palette();
  16. p.setColor(QPalette::Normal,QPalette::WindowText,color);
  17. label->setPalette(p);
  18. edit->setPlainText(text);
  19. }
  20. void
  21. Settings::writeSettings()
  22. {
  23. QSettings setting("MyPro","settings");
  24. setting.beginGroup("Dialog");
  25. setting.setValue("position",pos());
  26. setting.setValue("size",size());
  27. setting.endGroup();
  28. setting.beginGroup("Content");
  29. setting.setValue("color",label->palette().color(QPalette::WindowText));
  30. setting.setValue("text",edit->toPlainText());
  31. setting.endGroup();
  32. }

12、两个信号连接同一个槽

参考上述的例8。

  1. connect(ui->btn_ok, SIGNAL(clicked()), this, SLOT(slotClick()));
  2. connect(ui->btn_cancel, SIGNAL(clicked()), this, SLOT(slotClick()));
  1. void Dialog::slotClick()
  2. {
  3. QPushButton* btn = dynamic_cast<QPushButton*>(sender());
  4. if (btn == ui->btn_ok) {
  5. qDebug() << "button:" <<ui->btn_ok->text();
  6. }
  7. else if (btn == ui->btn_cancel) {
  8. qDebug() << "button:" <<ui->btn_cancel->text();
  9. }
  10. }

有时button类型不同时,可以分别判断对象指针。

  1. void Dialog::slotClick()
  2. {
  3. ;
  4. if ((QPushButton* btn = dynamic_cast<QPushButton*>(sender())) == ui->btn_ok) {
  5. qDebug() << "button:" <<ui->btn_ok->text();
  6. }
  7. else if ((QRadioButton* btn = dynamic_cast<QRadioButton*>(sender())) == ui->btn_cancel) {
  8. qDebug() << "button:" <<ui->btn_cancel->text();
  9. }
  10. }

13、对话框操作

视图模型中, 设置视图不可编辑 setEditTriggers(QAbstractItemView::NoEditTriggers);

对话框去掉右上角的问号: setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint);

对话框加上最小化按钮: setWindowFlags(windowFlags()|Qt::WindowMinimizeButtonHint);

14、多语言国际化

1.pro工程文件里面添加 TRANSLATIONS+=mypro.ts
2.选择Qt Creator环境的菜单栏 工具->外部->Qt语言家->更新翻译(或lupdate mypro.pro或lupdate-qt4mypro.pro)
3.桌面开始菜单里面Qt目录打开 Linguist工具
4.Linguist工具加载生成好的mypro.ts文件
5.填好翻译, 保存, Release, 就生成好编译后的qm文件
6.在工程的源文件中, 这样加载qm文件:
  QTranslator translator;
  QLocale locale;
  if(QLocale::Chinese == locale.language())
  {//中文环境
      translator.load("mypro.qm");  //中文
      a.installTranslator(&translator);
  }//否则默认用英文

15、item-view控件多选后删除

  1. setSelectionMode(QAbstractItemView::MultiSelection); //不按ctrl键即可多选
  2. setSelectionMode(QAbstractItemView::ExtendedSelection);  //按ctrl键多选
  3. QModelIndexList indexList = ui->listvFiles->selectionModel()->selectedRows();
  4. QModelIndex index;
  5. int i = 0;
  6. foreach(index, indexList)
  7. {
  8. this->modFileLists.removeRow(index.row() - i);
  9. ++i;
  10. }

16、QByteArray存入中文时乱码

  1. QByteArray bytes;
  2. bytes.append(this->modFileLists.data(this->modFileLists.index(i), Qt::DisplayRole).toString()); //乱码
  3. QByteArray bytes;
  4. bytes.append(this->modFileLists.data(this->modFileLists.index(i), Qt::DisplayRole).toString().toLocal8Bit()); //正常

17、Qt托盘

  1. //使用QSystemTrayIcon类
  2. QSystemTrayIcon *tray;      //托盘
  3. QMenu *meuTray;             //托盘菜单
  4. QAction *acTrayQuit;        //托盘退出
  5. this->tray = new QSystemTrayIcon(this);
  6. this->meuTray = new QMenu(this);
  7. this->acTrayQuit = this->meuTray->addAction(QIcon(":/res/image/quit.png"), tr("Quit"));
  8. connect(this->acTrayQuit, SIGNAL(triggered()), this, SLOT(OnExit()));
  9. this->tray->setContextMenu(this->meuTray);
  10. this->tray->setIcon(QIcon(":/res/image/tray.ico"));
  11. this->tray->show();
  12. connect(this->tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(OnTrayActivated(QSystemTrayIcon::ActivationReason)));
  13. voidUpdateTerminal::OnTrayActivated(QSystemTrayIcon::ActivationReasonreason)
  14. {
  15. switch(reason)
  16. {
  17. caseQSystemTrayIcon::DoubleClick:
  18. if(this->isHidden())
  19. this->show();
  20. break;
  21. }
  22. }

18、Qt递归遍历文件和文件夹

  1. //递归遍历文件夹,找到所有的文件
  2. //_filePath:要遍历的文件夹的文件名
  3. int FindFile(const QString& _filePath)
  4. {
  5. QDir dir(_filePath);
  6. if (!dir.exists()) {
  7. return -1;
  8. }
  9. //取到所有的文件和文件名,但是去掉.和..的文件夹(这是QT默认有的)
  10. dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
  11. //文件夹优先
  12. dir.setSorting(QDir::DirsFirst);
  13. //转化成一个list
  14. QFileInfoList list = dir.entryInfoList();
  15. if(list.size()< 1 ) {
  16. return -1;
  17. }
  18. int i=0;
  19. //递归算法的核心部分
  20. do{
  21. QFileInfo fileInfo = list.at(i);
  22. //如果是文件夹,递归
  23. bool bisDir = fileInfo.isDir();
  24. if(bisDir) {
  25. FindFile(fileInfo.filePath());
  26. }
  27. else{
  28. //bool isDll = fileInfo.fileName().endsWith(".dll");
  29. qDebug() << fileInfo.filePath() << ":" <<fileInfo.fileName();
  30. }//end else
  31. i++;
  32. } while(i < list.size());
  33. }

若只想获取文件名,也可以这样使用:

  1. int FindFile(const QString& _filePath)
  2. {
  3. QDir dir(_filePath);
  4. if (!dir.exists()) {
  5. return -1;
  6. }
  7. //取到所有的文件和文件名,但是去掉.和..的文件夹(这是QT默认有的)
  8. dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
  9. //文件夹优先
  10. dir.setSorting(QDir::DirsFirst);
  11. //转化成一个list
  12. QFileInfoList list = dir.entryInfoList();
  13. QStringList infolist = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
  14. if(list.size()< 1 ) {
  15. return -1;
  16. }
  17. int i=0;
  18. //递归算法的核心部分
  19. do{
  20. QFileInfo fileInfo = list.at(i);
  21. //如果是文件夹,递归
  22. bool bisDir = fileInfo.isDir();
  23. if(bisDir) {
  24. FindFile(fileInfo.filePath());
  25. }
  26. else{
  27. for(int m = 0; m <infolist.size(); m++) {
  28. //这里是获取当前要处理的文件名
  29. qDebug() << infolist.at(m);
  30. }
  31. break;
  32. }//end else
  33. i++;
  34. } while(i < list.size());
  35. }

19、Qt调用外部程序QProcess

(1)使用startDetached或execute
       使用QProcess类静态函数QProcess::startDetached(const QString &program, constQStringList &argument)或者QProcess::execute(const QString &program, const QStringList &argument);startDetached 函数不会阻止进程, execute会阻止,即等到这个外部程序运行结束才继续执行本进程。
例如执行:Shutdown.exe -t -s 3600
  1. QStringList  list;
  2. list<< "-t" << "--s" << "3600";
  3. QProcess::startDetached("Shutdown.exe",list);
  4. // QProcess::execute("Shutdown.exe",list);

(2)创建QProcess,使用start函数

可以查看外部程序返回的数据,输出结果。

  1. QProcess *pProces = new QProcess(this);
  2. connect(pProces, SIGNAL(readyRead()),this, SLOT(on_read()));
  3. QStringList list;
  4. pProces->start("Shutdown.exe", list);
  5. void on_read()
  6. {
  7. QProcess *pProces = (QProcess *)sender();
  8. QString result = pProces->readAll();
  9. QMessageBox::warning(NULL, "", result);
  10. }

(3)执行的是程序,如route、ipconfig

  1. QProcess p(0);
  2. p.start("route");
  3. p.waitForStarted();
  4. p.waitForFinished();
  5. qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
  1. QProcess p(0);
  2. p.start("ipconfig");
  3. p.waitForStarted();
  4. p.waitForFinished();
  5. qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());

(4)执行的是命令,如dir

  1. QProcess p(0);
  2. p.start("cmd");
  3. p.waitForStarted();
  4. p.write("dir\n");
  5. p.closeWriteChannel();
  6. p.waitForFinished();
  7. qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());

或者:

  1. QProcess p(0);
  2. p.start("cmd", QStringList()<<"/c"<<"dir");
  3. p.waitForStarted();
  4. p.waitForFinished();
  5. qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());

(5)QProcess使用管道(命令中不支持管道符|)
一个进程的标准输出流到目标进程的标准输入:command1 | command2。

  1. QProcess process1;
  2. QProcess process2;
  3. process1.setStandardOutputProcess(&process2);
  4. process1.start("command1");
  5. process2.start("command2");

20、当前系统Qt所支持的字体

  1. QFontDatabase database;
  2. foreach (QString strFamily, database.families()) {
  3. qDebug() <<"family:" << strFamily;
  4. foreach (QString strStyle, database.styles(strFamily)) {
  5. qDebug() << "-----style:" << strStyle;
  6. }
  7. }

系统中所有支持中文的字体名称

  1. QFontDatabase database;
  2. foreach (const QString &family, database.families(QFontDatabase::SimplifiedChinese))
  3. {
  4. qDebug()<<family;
  5. }

中文乱码:

  1. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
  2. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

21、IP正则匹配

  1. {
  2. /**********judge ip**********/
  3. QRegExp regExp("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)");
  4. if(!regExp.exactMatch(ip)) {
  5. flag  = false;
  6. ipAddressLineEdit->clear();
  7. ipAddressLineEdit->setError(true);
  8. ipAddressLineEdit->setHint(tr("           IpAddress is wrong"));
  9. }
  10. else  flag = true;
  11. }

22、QPushButton去掉虚线框

  1. QPushButton:focus{padding: -1;}
  2. /*
  3. {border-style:flat;}    //扁平
  4. button->setFlat(true)
  5. ui->checkBox->setFocusPolicy(Qt::NoFocus);
  6. ui->radioButton->setFocusPolicy(Qt::NoFocus);
  7. */

23、Qt临时获得root权限

(1)getuid()函数返回一个调用程序的真实用户ID,使用root执行程序时getuid()返回值为0。

  1. if (getuid() != 0)
  2. {
  3. QMessageBox::information(0, QString(QObject::tr("Warnning")),
  4. QString(QObject::tr("do not use root privage")),
  5. QString(QObject::tr("OK")));
  6. return -1;
  7. }

(2)临时获得root权限

使用getuid()/setuid()函数,让程序临时获得root权限代码。

  1. /*
  2. * gcc -g -o test-uid test-uid.c
  3. * chown root.root ./test-uid
  4. * chmod 4755 ./test-uid
  5. * ls -al /var
  6. * */
  7. #include<stdio.h>
  8. #include<unistd.h>
  9. #include<sys/types.h>
  10. int main(int argc, char **argv)
  11. {
  12. // save user uid
  13. uid_t uid = getuid();
  14. // get root authorities
  15. if(setuid(0)) {
  16. printf("test-uid: setuid error");
  17. return -1;
  18. }
  19. printf("test-uid: run as root, setuid is 0\n");
  20. system ("touch /var/testroot");
  21. // rollback user authorities
  22. if(setuid(uid)) {
  23. printf("test-uid: setuid error");
  24. return -1;
  25. }
  26. printf("test-uid: run as user, setuid is %d\n", uid);
  27. system ("touch /var/testuser");
  28. return 0;
  29. }

24、Qt窗口的透明度设置

(1)设置窗体的背景色
在构造函数里添加代码,需要添加头文件qpalette或qgui
QPalette pal = palette(); 
pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); 
setPalette(pal);
通过设置窗体的背景色来实现,将背景色设置为全透。
效果:窗口整体透明,但窗口控件不透明,QLabel控件只是字显示,控件背景色透明;窗体客户区完全透明。
(2)在MainWindow窗口的构造函数中使用如下代码:
this->setAttribute(Qt::WA_TranslucentBackground, true); 
效果:窗口变透明,label也变透明,看不到文字,但是其它控件类似textEdit、comboBox就不会透明,实现了窗口背景透明。 
(3)在MainWindow窗口的构造函数中使用如下代码 
 this->setWindowOpacity(level);其中level的值可以在0.0~1.0中变化。 
 效果:窗口变成透明的,但是所有控件也是一样变成透明。 
(4)窗口整体不透明,局部透明:
在Paint事件中使用Clear模式绘图。
void TestWindow::paintEvent( QPaintEvent* )

QPainter p(this);
p.setCompositionMode( QPainter::CompositionMode_Clear );
p.fillRect( 10, 10, 300, 300, Qt::SolidPattern ); 

效果:绘制区域全透明。如果绘制区域有控件不会影响控件

25、Qt解决中文乱码

在Windows下常使用的是GBK编码,Linux下常使用的是utf-8编。
选一下任意试试:

  1. QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
  2. QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
  3. QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8"));

//获取系统编码,否则移植会出现乱码
QTextCodec*codec = QTextCodec::codecForName("System");
//设置和对本地文件系统读写时候的默认编码格式
QTextCodec::setCodecForLocale(codec);
//设置传给tr函数时的默认字符串编码
QTextCodec::setCodecForTr(codec);
//用在字符常量或者QByteArray构造QString对象时使用的一种编码方式
QTextCodec::setCodecForCStrings(codec); 
支持linux单一系统时:

  1. QTextCodec *codec = QTextCodec::codecForName("utf8");
  2. QTextCodec::setCodecForLocale(codec);
  3. QTextCodec::setCodecForCStrings(codec);
  4. QTextCodec::setCodecForTr(codec);

26、图片做背景缩放

  1. QPixmap backGroundPix = QPixmap(":/resources/images/login.png");
  2. QMatrix martix;
  3. martix.scale(0.95, 0.9);
  4. backGroundPix = backGroundPix.transformed(martix);
  5. resize(backGroundPix.width(),  backGroundPix.height());
  6. QPalette palette;
  7. palette.setBrush(QPalette::Window,QBrush(backGroundPix));
  8. setPalette(palette);

或者:

  1. QPixmap backGroundPix;
  2. backGroundPix.load(":/resources/images/login.png");
  3. setAutoFillBackground(true);   // 这个属性一定要设置
  4. QPalette pal(palette());
  5. pal.setBrush(QPalette::Window, QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio, \
  6. Qt::SmoothTransformation)));
  7. setPalette(pal);

27、Qt之界面出现、消失动画效果

(1)界面出现

将下面这段代码放在界面的构造函数当中就行

//界面动画,改变透明度的方式出现0 - 1渐变
 QPropertyAnimation *animation = newQPropertyAnimation(this, "windowOpacity");
 animation->setDuration(1000);
 animation->setStartValue(0);
 animation->setEndValue(1);
 animation->start();

(2)界面消失:

既然是界面消失,应当是按下关闭按钮时界面消失,如下:

//连接关闭按钮信号和槽

QObject::connect(close_button, SIGNAL(clicked()), this,SLOT(closeWidget()));

//槽函数如下,主要进行界面透明度的改变,完成之后连接槽close来调用closeEvent事件

bool LoginDialog::closeWidget()
{
   //界面动画,改变透明度的方式消失1 - 0渐变
   QPropertyAnimation *animation= new QPropertyAnimation(this, "windowOpacity");
  animation->setDuration(1000);
  animation->setStartValue(1);
  animation->setEndValue(0);
  animation->start();   
  connect(animation,SIGNAL(finished()), this, SLOT(close()));
  return true;  
}

void LoginDialog::closeEvent(QCloseEvent *)
{
    //退出系统
   QApplication::quit();
}

界面消失的类似方法(比较笨拙,而且效率差):

void LoginDialog::closeEvent(QCloseEvent *)
{

for(int i=0; i< 100000; i++)
 {
  if(i<10000)
  {
   this->setWindowOpacity(0.9);
  }
  else if(i<20000)
  {
   this->setWindowOpacity(0.8);
  }
  else if(i<30000)
  {
   this->setWindowOpacity(0.7);
  }
  else if(i<40000)
  {
   this->setWindowOpacity(0.6);
  }
  else if(i<50000)
  {
   this->setWindowOpacity(0.5);
  }
  else if(i<60000)
  {
   this->setWindowOpacity(0.4);
  }
  else if(i<70000)
  {
   this->setWindowOpacity(0.3);
  }
  else if(i<80000)
  {
   this->setWindowOpacity(0.2);
  }
  else if(i<90000)
  {
   this->setWindowOpacity(0.1);
  }
  else
  {
   this->setWindowOpacity(0.0);
  }
 }
 //进行窗口退出
  QApplication::quit();
}

28、Qt获取系统文件图标

1、获取文件夹图标

QFileIconProvider icon_provider;
 QIcon icon = icon_provider.icon(QFileIconProvider::Folder);

2、获取指定文件图标

QFileInfo file_info(name);
QFileIconProvider icon_provider;
QIcon icon = icon_provider.icon(file_info);

29、Qt把整形数据转换成固定长度字符串

有时需要把money的数字转换成固定格式,如660066转换成660,066,就需要把整形数据转换成固定长度字符串(即前面位数补0的效果)。有如下方法:

  1. QString int2String(int num, int size)
  2. {
  3. QString str = QString::number(num);
  4. str = str.rightJustified(size,'0');
  5. return str;
  6. }

  1. QString int2String(int number, int size)
  2. {
  3. return QString("%1").arg(number, size, 10, QChar('0'));
  4. }

  1. QString int2String(int number, int size)
  2. {
  3. QString str;
  4. str.fill('0', size);
  5. str.push_back(QString::number(number));
  6. str = str.right(size);
  7. return str;
  8. }

故处理数字:

  1. QString value = "";
  2. QString temp = "";
  3. int number = 100060010;
  4. if (number < 1000) {
  5. value = QString::number(number);
  6. }
  7. else if (number < 1000 * 1000) {
  8. value = QString::number(number/1000);
  9. value += ",";
  10. //temp = QString::number(number%1000);
  11. //temp = temp.rightJustified(3,'0');
  12. //temp.fill('0', 3);
  13. //temp.push_back(QString::number(number));
  14. //temp = temp.right(3);
  15. value += QString("%1").arg(number%1000, 3, 10, QChar('0'));
  16. }
  17. else if (number < 1000*1000*1000) {
  18. value = QString::number(number/(1000*1000));
  19. value += ",";
  20. number = number%(1000*1000);
  21. value += QString("%1").arg(number/1000, 3, 10, QChar('0'));
  22. value += ",";
  23. value += QString("%1").arg(number%1000, 3, 10, QChar('0'));
  24. }
  25. qDebug() << "==============" << value;

输出:============== "100,060,010"

30、QLabel的强大功能

(1)QLabel的自动换行pLabel->setWordWrap(true);

  1. QTextCodec *codec = QTextCodec::codecForName("utf8");
  2. QTextCodec::setCodecForLocale(codec);
  3. QTextCodec::setCodecForCStrings(codec);
  4. QTextCodec::setCodecForTr(codec);
  5. QLabel *pLabel = new QLabel(this);
  6. pLabel->setStyleSheet("color: red");
  7. //pLabel->setAlignment(Qt::AlignCenter);
  8. pLabel->setGeometry(30, 30, 150, 150);
  9. pLabel->setWordWrap(true);
  10. QString strText = QString("床前明月光,疑是地上霜。举头望明月,低头思故乡。");
  11. QString strHeightText = "<p style=\"line-height:%1%\">%2<p>";
  12. strText = strHeightText.arg(150).arg(strText);
  13. pLabel->setText(strText);

(2)QLabel的过长省略加tips,通过QFontMetrics来实现

  1. QTextCodec *codec = QTextCodec::codecForName("utf8");
  2. QTextCodec::setCodecForLocale(codec);
  3. QTextCodec::setCodecForCStrings(codec);
  4. QTextCodec::setCodecForTr(codec);
  5. QLabel *pLabel = new QLabel(this);
  6. pLabel->setStyleSheet("color: red");
  7. pLabel->setGeometry(30, 30, 150, 150);
  8. pLabel->setWordWrap(true);
  9. QString strText = QString("床前明月光,疑是地上霜。举头望明月,低头思故乡。");
  10. QString strElidedText = pLabel->fontMetrics().elidedText(strText, Qt::ElideRight, 150, Qt::TextShowMnemonic);
  11. pLabel->setText(strElidedText);
  12. pLabel->setToolTip(strText);

(3)QLabel的富文本

  1. QTextCodec *codec = QTextCodec::codecForName("utf8");
  2. QTextCodec::setCodecForLocale(codec);
  3. QTextCodec::setCodecForCStrings(codec);
  4. QTextCodec::setCodecForTr(codec);
  5. QLabel *pLabel = new QLabel(this);
  6. pLabel->setStyleSheet("color: red");
  7. //pLabel->setAlignment(Qt::AlignCenter);
  8. pLabel->setGeometry(30, 30, 150, 150);
  9. pLabel->setWordWrap(true);
  10. QString strHTML = QString("<html> \
  11. <head> \
  12. <style> font{color:red;} #f{font-size:18px; color: green;} </style> \
  13. </head> \
  14. <body>\
  15. <font>%1</font><font id=\"f\">%2</font> \
  16. </body> \
  17. </html>").arg("Hello").arg("World");
  18. pLabel->setText(strHTML);
  19. pLabel->setAlignment(Qt::AlignCenter);

Qt浅谈之总结(整理)的更多相关文章

  1. Qt浅谈内存泄露(总结)

    Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...

  2. Qt——浅谈样式表

    优秀的程序,不仅要有严密逻辑,而且应该有美观的外表.从软件界面,便可看出你是否用心在做,是否是一个有思想的人. Qt样式表的术语和语法规则和HTML CSS有很多相似之处. 样式规则 Qt中样式规则由 ...

  3. Qt浅谈之四十九俄罗斯方块(代码来自网络)

    一.简介 从网上下载了一个Qt实现的俄罗斯方块单机版的源码,觉得非常有意思,故以博客形式记录下来,以便慢慢来研究.在centos6.6下编译运行(注意程序运行需要读取pro目录的配置文件,若把编译目录 ...

  4. Qt浅谈之二十七进程间通信之QtDBus

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

  5. Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口

    一.简介 最近看到一篇Qt实现伸缩滑动的窗口的文章,但其代码不完整.便在此重新书写了完整的代码,并开源出来.窗口的中央有滑动条可以动态改变子窗口的大小,隐藏的按钮可以快速伸缩子窗口.其效果图如下: 二 ...

  6. Qt浅谈之二十App自动重启及关闭子窗口

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  7. Qt浅谈之二十App自动重启及关闭子窗口(六种方法)

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  8. Qt浅谈之一:内存泄露(总结)

    一.简介       Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Q ...

  9. Qt::浅谈信号槽连接,参数在多线程中的使用

    Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...

随机推荐

  1. MySQL入门篇(二)之常见命令管理

    一.SQL结构化查询语言 SQL,英文全称Structured Query Language,中文意思是结构化查询语言.它是一种对关系数据库中的数据进行定义和操作的语言方法,是大多数关系数据库管理系统 ...

  2. mysql 错误代码 1248

    1248 - Every derived table must have its own alias (MYSQL错误) 这句话的意思是说每个派生出来的表都必须有一个自己的别名,给派生表加上一个别名就 ...

  3. Matplotlib API汉化

    Pyplot API 示例汇总:https://matplotlib.org/gallery/index.html#api-examples 该matplotlib.pyplot模块包含的功能允许您快 ...

  4. symfony注册Twig模板中使用自定义PHP方法

    // 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 官方文档,https://symfony.com/doc/2.8/templating/twig_extension.html// ...

  5. Windows下MongoDB优化及问题处理

    1.MongoDB 服务器CPU占用100% 给Mongodb对应数据库中的表建立索引,这里我采用使用工具:NoSQL Manager for MongoDB 直接在表的属性栏,选择Indexes,右 ...

  6. php文章tag标签的增删

    <?php session_start();   if($_POST){           $_SESSION['old']=array('one','two','three','four', ...

  7. Phaser3 屏幕适配iPhoneX、iPhoneXs的坑 -- JavaScript Html5 游戏开发

      PhaserJS 坑:在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设为 window.innnerWidth在config内不 ...

  8. [leetcode]三数之和

    三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...

  9. Rest-Assured 测试框架

    Rest-Assured 是一个测试 Restful Web Service 的 Java 类库,我们能够测试各种各样的请求组合,依次测试核心业务逻辑的不同组合. 它是通过发送特定的rest api, ...

  10. 【Python进阶】无论API怎么变,SDK都可以根据URL实现完全动态的调用

    现在很多网站都搞REST API,比如新浪微博.豆瓣啥的,调用API的URL类似: http://api.server/user/friends http://api.server/user/time ...