QT常用的一些写法,个人整理,持续更新
这里写目录标题
- QT常用的一些写法,个人整理,持续更新
- 1. 文本框设置文字、获取文字:
- 2. 定时器的声名、开启、定时设置、槽函数:
- 3. 16进制格式打印数组:
- 4. LED闪烁,改变QLabel的颜色:
- 5. 打开一个新UI:
- 6. 批量操作!多个按钮绑定同一个槽函数,QList的使用:
- 7. 禁用/启用一个界面元素:
- 8.跨文件链接信号槽。用CAN发送接收举例:
- 9.表格控件tableWidget的常用写法:
- 10.Linux系统使用QT修改一个配置文件,这里修改了一个以太网连接的配置文件:
- 11.Linux系统在QT中使用命令行:
- 12.分页控件stackedWidget的连接Connect:
- 13. static 只初始化一次的变量:
- 14. 随机数生成:
- 15. 自适应修改分率:
- 16. QT默认的字体:
- 17. label中显示GIF图片
- 17. 程序所在路径的获取
1. 文本框设置文字、获取文字:
ui->lineEdit_IP->setText("192.168.8.123");//设置内容
QString ip = ui->lineEdit_IP->text();//获取内容
2. 定时器的声名、开启、定时设置、槽函数:
头文件中(.h)
#include <QTimer>
private slots:
void my_Time_Slot();//声名槽函数,可以理解成中断函数,但需要绑定
private:
QTimer *my_time;//声名
源文件中(.cpp)
my_time = new QTimer(this);//取出声名的定时器
connect(my_time,SIGNAL(timeout()),this,SLOT(my_Time_Slot()));//绑定槽函数
my_time->start(100);//100毫秒中断,启动定时器
3. 16进制格式打印数组:
char buf[] = {0XF1,0XA1,0X06,0X0A,0X01,0XA3};//定义数组
int len = 6;//数组长度
QString str;//定义字符串
for(int j=0;j<len;j++)
str.append(QString().sprintf("%02X ",(uchar)(buf[j])));//整理数组到字符串
ui->textBrowser->textCursor().insertText(str);//打印或显示字符串
ui->textBrowser->textCursor().insertText("\r\n");//回车换行自己写
4. LED闪烁,改变QLabel的颜色:
setStyleSheet是改变样式表。在界面文件里编辑样式表的语句都可以用。
LED_Flag = !LED_Flag;
if(LED_Flag)
ui->Time_Flag_LED->setStyleSheet("background-color: rgb(170, 170, 0)");//红色
else
ui->Time_Flag_LED->setStyleSheet("background-color: rgb(170, 0, 0)");//绿色
5. 打开一个新UI:
准备工作:
1,先建立一个新的界面:右键工程——新建文件——Qt——QT设计师界面类。
2,编辑完界面后,在主界面里包含新文件的(.h)文件。
有几种打开方式:
(1)在界面内打开,这样打开是没有窗口头的,也不能移动,只能用代码设定坐标。
test_Form1 *test1 = new test_Form1(this);
test1->show();
test1->move(500,300);
(2)新建窗口打开,这样打开有表头,可以拖动窗口。
test_Form1 *test1 = new test_Form1;
test1->show();
(3)去掉标题栏
ui->setupUi(this);//这一句是系统自动生成的
this->setWindowFlags(Qt::FramelessWindowHint);//这一句是去掉标题栏
持续更新
6. 批量操作!多个按钮绑定同一个槽函数,QList的使用:
//将界面中的4个按键存入QList类型的QList_PushButton中
QList<QPushButton*>QList_PushButton{ui->DI_1,ui->DI_2,ui->DI_3,ui->DI_4};
//建立槽函数,槽函数中设定一个参数就是i
for(int i=0;i<4;i++)
connect(QList_PushButton[i],&QPushButton::clicked,[=](){OnButton(i);});
7. 禁用/启用一个界面元素:
使用setEnabled(false)和 setEnabled(true) 。
这里例举了一个按钮。
ui->pushButton_TCP->setEnabled(false);//禁用按钮
ui->pushButton_TCP->setEnabled(true);//启用按钮
8.跨文件链接信号槽。用CAN发送接收举例:
这里定义两个CPP文件,第一个mainwindow.cpp,第二个canrevthread.cpp。
定义两个信号槽,一个发送是MAIN发给CAN。一个接收是CAN发给MAIN。
下面是CAN.H中的定义。注意槽定义必须是public ,这样其他文件才能调用。
public slots:
void CANSendRev(int index,int len,uchar *data);//定义发送数据的槽
signals:
void threadRev(int index,int len,uchar *data);//定义接收数据的信号
下面是CAN.CPP中的。
//发送读取数据信号
emit threadRev(CAN1_ID,CAN1_DLC,CAN1_DATA);//发送读取数据的信号
//接收发送数据信号的槽
void canRevThread::CANSendRev(int index, int len, uchar *data)
{
frame.can_id = CAN_EFF_FLAG | index;
frame.can_dlc = len;
for(int i=0;i<len;i++)
frame.data[i] = data[i];
int err = write(s, &frame, sizeof(frame)); //发送 frame
qWarning()<<err;
}
下面是MAIN.H中的
#include "canrevthread.h"//包含CAN的头文件
private slots:
void readCANMessage(int ID,int DLC,uchar *DATA);//定义接收数据槽
signals:
void thSendRev(int index,int len,uchar *data);//定义发送数据信号
下面是MAIN.CPP中的,连接两个槽函数的要再MAIN的初始化中进行。
connect(rth,SIGNAL(threadRev(int,int,uchar*)),this,SLOT(readCANMessage(int,int,uchar*)));
connect(this,SIGNAL(thSendRev(int,int,uchar*)),rth,SLOT(CANSendRev(int,int,uchar*)));
emit thSendRev(0x0100f1a0,2,form);//触发发送数据的信号。
void MainWindow::readCANMessage(int ID, int DLC, uchar *DATA)//接收数据的槽函数
{
ID_UP = ID & CAN_EFF_MASK;
DLC_UP = DLC;
DATA_UP = DATA;
readCANMessage_UP(ID_UP,DLC_UP,DATA_UP);
}
9.表格控件tableWidget的常用写法:
在界面文件UI中拖入一个tableWidget。双击可以编辑行和列。
批量写入每一个元素的程序。
设置每一列的宽度。
这里定义了一个二维数组存放数据。并且每一个格子都居中。
ui->tableWidget_CAN->setColumnWidth(0,100);//设置宽度
ui->tableWidget_CAN->setColumnWidth(1,50);//设置宽度
ui->tableWidget_CAN->setColumnWidth(2,150);//设置宽度
for(int i=0;i<6;i++)//6列
{
for(int j=0;j<4;j++)//4行
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(QString::number(UART_Table[i][j],10)));//设置行和列的数据
ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignCenter);//居中显示
}
}
ui->tableWidget_CAN->item(0, 0)->setBackground(Qt::red);//设置单元格背景颜色
ui->tableWidget_CAN->item(1, 0)->setForeground(Qt::red);//设置单元格字体颜色
表格设置
//***********************表格设置***********************
ui->tableWidget->verticalHeader()->setVisible(false);//隐藏行头
ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(0,170,0);font:15pt '新宋体';color: black;};");//设置表头字体
ui->tableWidget->horizontalHeader()->setFixedHeight(30);//设置表头高度
ui->tableWidget->setRowCount(41);//需要显示多少行
ui->tableWidget->setColumnCount(5);//设置5列
int w = ui->tableWidget->width()/10 - 2;//列宽度除以10为比例
qDebug()<<w;
ui->tableWidget->setColumnWidth(0,w*0.5);
ui->tableWidget->setColumnWidth(1,w*4.5);//最大的一个稍微减一点,就看不见下面的滚动条了
ui->tableWidget->setColumnWidth(2,w*3);
ui->tableWidget->setColumnWidth(3,w*1);
ui->tableWidget->setColumnWidth(4,w*1);
ui->tableWidget->setFont(QFont("NSimSun",15));
ui->tableWidget->verticalHeader()->setDefaultSectionSize(25);
ui->tableWidget->resizeRowsToContents();//自动换行
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//选择整行
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
表格设置2
ui->tableWidget->item(i,0)->setTextAlignment(Qt::AlignCenter);//居中
ui->tableWidget->item(i,0)->setBackground(Qt::red);//故障的设置成红色的
int rowCount = ui->tableWidget->rowCount();//获取行数
qDebug() << "data:" << ui->tableWidget->model()->index(row,column).data().toString();
想要清空表格,且不清空标题,只要设置零行就可以了
ui->tableWidget->setRowCount(0);//设置0行就是清空表格
10.Linux系统使用QT修改一个配置文件,这里修改了一个以太网连接的配置文件:
注意需要一个头文件。QFile
#include <QFile> //需要一个头文件
QFile f("/etc/sysconfig/network-scripts/ifcfg-以太网连接_1");//文件的绝对路径
bool b = f.open(QIODevice::ReadWrite);//打开这个文件,b为是否成功
qWarning()<<"b = "<<b;//显示出b,true是成功。
QTextStream data(&f);//把路径的文件放入data
QString info;//定义一个缓存区,备用。
QString row="\n";//定义一个换行符,备用。
while(!data.atEnd())//循环读取直到文件结束
{
QString sline = data.readLine();//一行一行的读取,每一行存放在sline中
qWarning()<<sline;//显示当前行
if(sline.contains("IPADDR="))//搜索关键字的一行,这里是找到IPADDR的一行
{
info.append("IPADDR=192.168.8.129");//在缓存区中改变这一行
}
else
{
info.append(sline);//不是关键行,复制数据到缓存区。
}
info.append(row);//插入换行到缓存区。
}
data.seek(0);//清空data
data<<info;//把缓存区的内容给目录文件。
11.Linux系统在QT中使用命令行:
QString cmd = "ifconfig eth1 ";//先定义一个字符串
cmd += ui->lineEdit_debug1->text(); //字符串可以+=什么什么
qWarning()<<"cmd = "<<cmd;//打印
QProcess::execute(cmd);//使用命令行
QProcess::execute(QString("ifconfig can1 down"));
QProcess::execute(QString("ip link set can1 type can bitrate 1000000"));
QProcess::execute(QString("ifconfig can1 up"));
12.分页控件stackedWidget的连接Connect:
首先再UI文件中建立好stackedWidget和pushButton。
ui->stackedWidget->setCurrentIndex(0);
connect(ui->pushButton_1,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(0);});
connect(ui->pushButton_2,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(1);});
connect(ui->pushButton_3,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(2);});
13. static 只初始化一次的变量:
void my_Time_Slot()
{
static int Time_Flag = 0;
Time_Flag++;
if(Time_Flag >= 10)
{
Time_Flag = 0;
}
}
14. 随机数生成:
需要两个头文件:
#include <QTimer>
#include <QDateTime>
代码,两个参数是最小值和最大值,返回的就是随机数
//生成随机数
double MainWindow::generateRand(double min, double max)
{
static bool seedStatus;
if (!seedStatus)
{
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
seedStatus = true;
}
if(min>max)
{
float temp=min;
min=max;
max=temp;
}
double diff = fabs(max-min);
double m1=(double)(qrand()%100)/100;
double retval=min+m1*diff;
return retval;
}
15. 自适应修改分率:
头文件:
#include "QDesktopWidget"
代码
QDesktopWidget *desktopW =QApplication::desktop();
QRect screenRect=desktopW->screenGeometry();
int sx=screenRect.width();
int sy=screenRect.height();
double scx=sx/1920.0;
double scy=sy/1080.0;
this->move(0,0);
this->resize(sx,sy);
QList<QWidget*> widgets=this->findChildren<QWidget*>();
foreach(auto w,widgets)
{
int oldX=w->x();
int oldY=w->y();
int oldW=w->width();
int oldH=w->height();
w->move(static_cast<int>(oldX*scx),static_cast<int>(oldY*scy));
w->resize(static_cast<int>(oldW*scx),static_cast<int>(oldH*scy));
}
16. QT默认的字体:
工具➡选项➡文本编辑器➡字型:选择Courier
17. label中显示GIF图片
.h文件中
包含QMovie.h
声明一个movie的类
#include <QMovie>
public:
QMovie movie;
.cpp中
QMovie *movie = new QMovie("C:/Users/LSX/Documents/test1/蹦蹦.gif");//new出一个movie,图片路径塞进去
movie->setScaledSize(ui->label->size());//获取显示容器label的尺寸,并设置
ui->label->setMovie(movie);//显示图片
movie->start();//开始播放
17. 程序所在路径的获取
qDebug() << QCoreApplication::applicationDirPath();
QString GIF_Path = QCoreApplication::applicationDirPath();
GIF_Path.append("/蹦蹦.gif");
qDebug() << GIF_Path;
输出结果为:
"C:/Users/LSX/Documents/test1/release"
"C:/Users/LSX/Documents/test1/release/蹦蹦.gif"