目录
周末优化了一下博客,把之前记录经验式的文章集合到这个地方,方便自己和大家查看。
1、判断字符串是不是数字
通过QString的方法toDouble()来判断字符串是不是数字。
bool flag=false;
QString str="8.8";
double d=-1;
d=str.toDouble(&flag);
qDebug()<<d; //输出8.8
qDebug()<<flag; //输出true
如果str是字符,比如str="abc",那么d会输出0,flag为false。
2、设置按钮背景图状态(鼠标悬浮,鼠标按下)
ui->qToolButton->setStyleSheet("QToolButton{border-image:url(:/image/nor.png);}" //正常
"QToolButton:hover{border-image:url(:/image/sel.png);}" //鼠标悬浮
"QToolButton:pressed{border-image:url(:/image/pre.png);}" //鼠标按下
);
3、保留n位有效数字或小数
保留n位有效数字:
double num=9.87654;
QString str=QString("%1").arg(num,0,'G',4); //保留四位有效数字,会进行四舍五入
qDebug()<<str; //输出9.877
保留n位小数:
double value=1.2345;
QString lastValue=QString::number(value,'f',2); //保留2位小数
4、解决因代码存在中文导致出现“常量中有换行符”的错误
在文件开头加上这句
#pragma execution_character_set("utf-8")
然后在notepad++上将文件编码设置为utf-8格式,关掉Qt Createor再重新打开,或者重新编译就好了。
如果设置完上述还是不行,需要在notepad++上将文件编码设置为utf-8-BOM即可
5、Qt之QPushButton实现文本省略...
QFontMetrics elideFont(ui->pushButton->font());
ui->pushButton->setText(elideFont.elidedText(ui->pushButton->text(), Qt::ElideRight, ui->pushButton->width()));
6、通过读取文件设置qss
QFile file(":/qss/test.qss");
if(!file.open(QFile::ReadOnly))
{
return -1;
}
QString style = file.readAll();
this->setStyleSheet(style);
file.close();
7、手动计算进度条百分比
ui->valuelab->setText(QString("%1%").arg(ui->progressBar->value()*100/ui->progressBar->maximum()));
需要注意的是,value()和maximum()返回的是int类型,如果文件过大,因为int取值范围有限,会导致value*100后再除maximum后出现越界,导致显示异常。
可以将其转换为double后再除,然后再转换为int显示。
8、传参设置字体
void setFont(QString font)
{
ui->label->setStyleSheet(QString("font-family:\"%1\";color:#FFFFFF").arg(font));
}
9、杀死第三方软件或后台进程
QProcess类是Qt提供的启动外部程序的类,通过start()接口运行指定的程序。tasklist表示打开进程列表,通过contains()查找进程列表返回的字符串中是否存在 需要kill的进程号 或者 程序名字。
QProcess process;
process.start("tasklist");
if (process.waitForFinished())
{
QByteArray result = process.readAllStandardOutput();
QString PidStr = QString::fromLocal8Bit(result);
//if (PidStr.contains("2468")) //已知进程号
//process.execute("taskkill", QStringList() << "-pid" << 2468 << "-f");
if (PidStr.contains("kill.exe")) //已知程序名
process.execute("taskkill", QStringList() << "-im" << "kill.exe" << "-f");
}
10、lineEdit限制输入特殊字符并设置密码输入模式
//限制以下特殊符号在lineEdit中的输入
QRegExp rx = QRegExp("[^,。;;.、‘//]*");
QRegExpValidator *validator = new QRegExpValidator(rx);
ui->lineEdit->setValidator(validator);
//设置密码输入
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit->setMaxLength(12);
11、tableview设置某行的一个项无法被选择
//绑定值到视图中
model->setItem(0,0,new QStandardItem(ui->num1->text()));
model->setItem(0,1,new QStandardItem(ui->comboBox->currentText()));
model->setItem(0,2,new QStandardItem(ui->num2->text()));
model->setItem(0,3,new QStandardItem(QString::number(result)));
//设置第二项不被选择
QStandardItem*item=model->item(0,2);
item->setFlags(item->flags()&~Qt::ItemIsSelectable);
12、获取函数运行的时间
#include <QApplication>
#include <QTime>
#include <QDebug>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
QTime t;
t.start();//将此时间设置为当前时间
for(int i=0;i<100;++i)
{
qDebug()<<i<<endl;
}
//elapsed(): 返回自上次调用start()或restart()以来经过的毫秒数
qDebug()<<t.elapsed()<<"ms";
return a.exec();
}
13、取消当前项被选中后的颜色
实际开发中,当我们点击tableview的某个item项(如更改该项的背景色),当更改完成后,此项仍然是被选择状态时的颜色,不便于观察修改后的背景色。
通过以下几句代码,可以取消当前项被选中的状态:
QModelIndex Index = ui.tableView->selectionModel()->currentIndex();
ui.tableView->selectionModel()->setCurrentIndex(Index, QItemSelectionModel::Deselect);
14、提取QString字符串中的所有数字
QRegExp rx("(\\d+)");
QString str = "data:16 99";
QStringList list; //存储数字
int p=0;
while((p = rx.indexIn(str,p)) != -1)
{
list<<rx.cap(1);
p += rx.matchedLength();
}
15、Qt Creator与vsaddin下载地址
Qt Creator
qt-vsaddin
Index of /official_releases/vsaddin
Qt Visual Studio Tools - Visual Studio Marketplace
16、事件过滤器(注册事件)
先为ui控件注册,通过下面的代码:
//为groupBox控件注册事件
ui->groupBox->installEventFilter(this);
然后重写eventFilter(QObject* obj,QEvent *event)事件即可,这样子,只有双击groupBox这个部件,才会触发条件,双击其他的位置没有反应。
bool MainView::eventFilter(QObject *obj,QEvent *event)
{
if(obj == ui->groupBox)
{
if(event->type() == QEvent::MouseButtonDblClick) //双击
{
//处理逻辑
return false;
}
}
return QObject::eventFilter(obj,event);
}
17、Qt定时器的使用
这里使用QTimer类来实现定时器,通过信号和槽机制实现定时效果。
通过timeout()信号连接到相应的槽,对象调用start()后,将以固定的时间间隔(start()括号中的数字)发射timeout()信号。
当某些时候不便使用多线程时,可以使用定时器来实现多线程的效果。
以下是具体实现程序,功能是,当label控件显示的数字到达60后,从0开始继续计数:
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
t=new QTimer(this);
t->start(1000);
connect(t,SIGNAL(timeout()),this,SLOT(showMsg()));
}
Widget::~Widget()
{
delete ui;
if(t!=NULL)
{
delete t;
t=NULL;
}
}
void Widget::showMsg()
{
if(number<60)
number++;
if(number>=60)
number=0;
ui->label->setText(QString::number(number));
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTime>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void showMsg();
private:
Ui::Widget *ui;
QTimer *t;
int number=0;
};
#endif // WIDGET_H
18、秒-转换为时分秒
QString Myqcustomplot::formatTime(int s)
{
if (s < 60)
return "00:00:"+QString::number(s);
long hor = s / 3600;
long min = (s % 3600) / 60;
long second = s % 3600 % 60;
return QString::number(hor) + ":" + QString::number(min) + ":" + QString::number(second);
}
19、获取本机ip
QString getLocalIp()
{
QString strIpAddress;
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
// 获取第一个本主机的IPv4地址
int nListSize = ipAddressesList.size();
for (int i = 0; i < nListSize; ++i)
{
if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
ipAddressesList.at(i).toIPv4Address()) {
strIpAddress = ipAddressesList.at(i).toString();
break;
}
}
// 如果没有找到,则以本地IP地址为IP
if (strIpAddress.isEmpty())
strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();
return strIpAddress;
}
20、编码转换
进行编码转换,避免显示乱码
QTextCodec *codec = QTextCodec::codecForName("GB2312");
#define TR(text) codec->toUnicode(text)