QT常用的一些写法,个人整理,持续更新

2 篇文章 0 订阅

QT常用的一些写法,个人整理,持续更新

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"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值