Qt--实战小经验

目录

1、判断字符串是不是数字

2、设置按钮背景图状态(鼠标悬浮,鼠标按下)

3、保留n位有效数字或小数

4、解决因代码存在中文导致出现“常量中有换行符”的错误

5、Qt之QPushButton实现文本省略...

6、通过读取文件设置qss

7、手动计算进度条百分比

8、传参设置字体

9、杀死第三方软件或后台进程

10、lineEdit限制输入特殊字符并设置密码输入模式

11、tableview设置某行的一个项无法被选择

12、获取函数运行的时间

13、取消当前项被选中后的颜色

14、提取QString字符串中的所有数字

15、Qt Creator与vsaddin下载地址

16、事件过滤器(注册事件)

17、Qt定时器的使用

18、秒-转换为时分秒

19、获取本机ip

20、编码转换


周末优化了一下博客,把之前记录经验式的文章集合到这个地方,方便自己和大家查看。

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

Index of /archive/qt

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)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值