QT的学习记录1

1、QT的编译过程(简单熟悉一下)

为了实现以下窗口的创建

首先在记事本中编写代码并保存在地址a:

#include <QApplication>//程序

#include<QLabel>//标签

#include<QLineEdit>//编辑框

#include<QPushButton>//按钮

#include<QHBoxLayout>//水平布局

#include<QVBoxLayout>//垂直布局

#include<QWidget>//窗口

int main(int argc,char *argv\[\])

{

QApplication app(argc,argv);

QLabel *infoLabel=new QLabel;

QLabel *openLabel=new QLabel;

QlineEdit *cmdLineEdit=new QLineEdit;

QPushButton *commitButton=new QPushButton;

QPushButton *cancelButton=new QPushButton;

QPushButton *browseButton=new QPushButton;

infoLabel->setText("input cmd:")

openLabel->setText("open")

commitButton->setText("commit");

cancelButton->setText("cancel");

browseButton->setText("browse");

QHBoxLayout *cmdLayout=new QHBoxLayout;//水平布局对象

cmdLayout->addWidget(openLabel);

cmdLayout->addWidget(cmdLineEdit);

QHBoxLayout *buttonLayout=new QHBoxLayout;

buttonLayout->addWidget(commitButton);

buttonLayout->addWidget(cancelButton);

buttonLayout->addWidget(browseButton);

QVBoxLayout *mainLayout=new QVBoxLayout;

mainLayout->addWidget(infoLabel);

mainLayout->addLayout(cmdLayout);//垂直布局中添加水平布局

mainLayout->addLayout(buttonLayout);

QWidget w;

w.setLayout(mainLayout);

w.show();

return app.exec();

}

首先可以在记事本中编写以上代码

之后在QT下载的包中寻找类似于以下的控制台:

打开控制台,先打开QT下载在某个盘(假设下载在C盘),输入指令:

之后将地址a进行复制 并打开:

打开之后先创建一个工程文件(如果失败需要新增环境变量,在高级设置中,将QT所在的bin文件夹整体加到path路径中并保存,之后重启电脑(如果设置之后还没用)):

会自动生成一个文件,用记事本打开之后添加一句话:

之后再在控制台输入命令:qmake

最终生成情况:

之后再在控制台输入:

之后在release中打开qmake.exe,生成的结果就是刚刚编写的代码:

添加一行代码:设置窗口的窗口名

结果如下:

2、Qt Creator

widget类似于一个弹窗,上边演示的就是这个类

mainwindow相当于一个包含菜单的窗口

在设计界面可以设计显示的界面布局,右边可以修改属性

生成结果:

3、信号与槽

实现文本框输入内容能打开该快捷方式

(1)点击按钮实现跳转

首先在ui界面右键点击按钮:

复制代码
之后对函数进行编写:
void Widget::on_browseButton_clicked()
复制代码
{
复制代码
    QString program=ui->cmdLineEdit->text();//获取文本框的数据
复制代码
    //创建process对象
复制代码
    QProcess *myProcess = new QProcess(this);
复制代码
    myProcess->start(program);//获取lineedit中的数据
复制代码
}

点击运行之后,在文本框中输入某快捷键的目标内容之后,点击按钮成功运行快捷键内容!

(2)在文本框中输入快捷方式之后按下回车实现跳转

除了转到信号槽的方法之外,还可以选择直接在程序的构造函数中添加代码,记住文本框的命名,之后在widget.cpp中继续修改构造函数,使用connect连接函数进行处理:

Widget::Widget(QWidget *parent)

: QWidget(parent)

, ui(new Ui::Widget)

{

ui->setupUi(this);

connect(ui->cmdLineEdit,SIGNAL(returnPressed()),this,SLOT(on_browseButton_clicked()));//连接信号与槽 谁发出信号、发出什么信号、谁处理信号、怎么处理信号(调用按下按钮的函数)

}

最终实现在文本框内输入内容,按下回车也可以打开快捷方式!

(3)地址(指针)实现取消的功能

首先在头文件中添加(实现取消的功能)槽函数:

复制代码
private slots:
复制代码
    void on_browseButton_clicked();
复制代码
    void on_cancelButton_clicked();

之后在widget.cpp中新添加该函数的实现方法:

复制代码
void Widget::on_cancelButton_clicked()
复制代码
{
复制代码
    this->close();
复制代码
}

之后再在构造函数中新增加一行连接函数的代码:

复制代码
connect(ui->cancelButton,&QPushButton::clicked,this,&Widget::on_cancelButton_clicked);

(4)不使用函数,直接使用表达式进行连接(函数中只有一句话,代码较少)

实现点击浏览时跳出弹框

先在头文件添加以下代码:

复制代码
#include<QMessage>

之后再在widget.cpp的构造函数中添加一个连接:

复制代码
    connect(ui->commitButton,&QPushButton::clicked,[this]()
复制代码
    {
复制代码
       QMessageBox::information(this,"信息","点击浏览");
复制代码
    });

结果如下:

4、四则运算器

首先在Ui设置计算器的界面:

使用Buttons中的Push Button为按键,并将该按键的最小最大都设置为40,之后复制按钮,按住ctrl鼠标点击空白处即可复制一个

使用Input Widgets中的Line Edit即可生成显示框

之后将所有按键选择栅格布局即可

里边有加减乘除以及清空、回退(在按键上可加图片进行显示)和括号的功能:

之后对按键的命名进行更改:

之后无论输入什么,都需要在编辑框内进行显示,因此需要在头文件中添加一个对象,用于记录表达式:

复制代码
private:
复制代码
    Ui::Widget *ui;
复制代码
    QString expression;
复制代码
};

之后在Ui界面的1按键右键选择转到槽,加入以下代码:

复制代码
void Widget::on_oneButton_clicked()
复制代码
{
复制代码
    expression+="1";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
运行即可实现1的显示:

之后对除了c和←箭头外的其余按键都进行转到槽,代码类似上边:

之后对c(清空)功能进行编写:

复制代码
void Widget::on_clearButton_clicked()
复制代码
{
复制代码
    expression.clear();
复制代码
    ui->mainlineEdit->clear();
复制代码
}

在回退按钮上添加图片:

在widget的构造函数中添加:

复制代码
 //按钮上放图片
复制代码
    QIcon con("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\calculator\\huitui.png");
复制代码
    ui->delButton->setIcon(con);

如果图片太小,可以在右下角这里设置宽高:

同样在构造函数中对标题和字体进行设置:

复制代码
ui->setupUi(this);
复制代码
    this->setWindowTitle("计算器");
复制代码
    QFont f("仿宋",14);//字体设置
复制代码
    ui->mainlineEdit->setFont(f);

之后对回退按钮的逻辑进行编写:

复制代码
void Widget::on_delButton_clicked()
复制代码
{
复制代码
    expression.chop(1);//参数表示从字符串最后往前删除的位数
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}

如果需要给按钮添加颜色,依然在构造函数中添加:

复制代码
   //给按钮添加颜色
复制代码
    ui->equalButton->setStyleSheet("background:orange");

之后实现=的功能:

在头文件中添加:

复制代码
#include<QStack>
复制代码
#include <cmath>
复制代码
#include <cctype>   // for isdigit
复制代码
#include <cstdlib>  // for strtod

之后为实现运算完成后就自动清空编辑框在头文件的私有成员中添加标记:

复制代码
bool needClear;  // 是否需要清屏(刚完成一次计算)

之后cpp完整代码如下:

复制代码
#include "widget.h"
复制代码
#include "ui_widget.h"
复制代码
#include <QStack>
复制代码
#include <cmath>
复制代码
#include <cctype>
复制代码
#include <cstdlib>
复制代码
#include <cstring>
复制代码
Widget::Widget(QWidget *parent)
复制代码
    : QWidget(parent)
复制代码
    , ui(new Ui::Widget)
复制代码
    , needClear(false)   // 初始化清屏标志
复制代码
{
复制代码
    ui->setupUi(this);
复制代码
    this->setWindowTitle("计算器");
复制代码
    QFont f("仿宋",14);
复制代码
    ui->mainlineEdit->setFont(f);
复制代码
    QIcon con("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\calculator\\huitui.png");
复制代码
    ui->delButton->setIcon(con);
复制代码
    ui->equalButton->setStyleSheet("background:orange");
复制代码
}
复制代码
Widget::~Widget()
复制代码
{
复制代码
    delete ui;
复制代码
}
复制代码
// 数字按钮 0-9
复制代码
void Widget::on_zeroButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "0";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_oneButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "1";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_twoButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "2";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_thereButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "3";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_fourButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "4";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_fiveButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "5";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_sixButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "6";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_sevenButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "7";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_eightButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "8";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_nineButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "9";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
// 运算符按钮
复制代码
void Widget::on_addButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "+";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
复制代码
void Widget::on_subButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "-";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_mulButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "×";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_divButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "/";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
// 括号按钮
复制代码
void Widget::on_leftButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += "(";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
void Widget::on_rightButton_clicked()
复制代码
{
复制代码
    if (needClear) {
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
    }
复制代码
    expression += ")";
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
// 清除按钮
复制代码
void Widget::on_clearButton_clicked()
复制代码
{
复制代码
    expression.clear();
复制代码
    ui->mainlineEdit->clear();
复制代码
    needClear = false;   // 手动清除时重置标志
复制代码
}
复制代码
// 退格按钮
复制代码
void Widget::on_delButton_clicked()
复制代码
{
复制代码
    // 退格时如果是刚计算完的状态,不做清屏,直接删除当前结果(或者可以先清屏再删除?为了合理,我们让退格也清除标志)
复制代码
    if (needClear) {
复制代码
        // 刚计算完,按退格应该清空并开始新输入,但退格一般用于删除上一个字符,这里简单处理:清空并重置
复制代码
        ui->mainlineEdit->clear();
复制代码
        expression.clear();
复制代码
        needClear = false;
复制代码
        return;
复制代码
    }
复制代码
    expression.chop(1);
复制代码
    ui->mainlineEdit->setText(expression);
复制代码
}
复制代码
// 等号按钮
复制代码
void Widget::on_equalButton_clicked()
复制代码
{
复制代码
    // 如果刚计算完且未开始新输入,再按等号无效
复制代码
    if (needClear) return;
复制代码
复制代码
    QString expr = ui->mainlineEdit->text();
复制代码
    if (expr.isEmpty()) {
复制代码
        ui->mainlineEdit->setText("0");
复制代码
        return;
复制代码
    }
复制代码
    expr.replace("×", "*");
复制代码
    expr.replace("÷", "/");
复制代码
    QByteArray ba = expr.toLocal8Bit();
复制代码
    const char* opt = ba.data();
复制代码
    auto priority = [](char op) -> int {
复制代码
        switch (op) {
复制代码
            case '+': return 1;
复制代码
            case '-': return 1;
复制代码
            case '*': return 2;
复制代码
            case '/': return 2;
复制代码
            default:  return 0;
复制代码
        }
复制代码
    };
复制代码
    auto applyOp = [](double a, double b, char op) -> double {
复制代码
        switch (op) {
复制代码
            case '+': return a + b;
复制代码
            case '-': return a - b;
复制代码
            case '*': return a * b;
复制代码
            case '/': return a / b;
复制代码
            default: return 0.0;
复制代码
        }
复制代码
    };
复制代码
    QStack<double> valStack;
复制代码
    QStack<char>   opStack;
复制代码
    int i = 0;
复制代码
    int len = strlen(opt);
复制代码
    while (i < len) {
复制代码
        char ch = opt[i];
复制代码
        if (ch == ' ') { i++; continue; }
复制代码
        if (isdigit(ch) || ch == '.') {
复制代码
            char* end;
复制代码
            double num = strtod(opt + i, &end);
复制代码
            valStack.push(num);
复制代码
            i = end - opt;
复制代码
            continue;
复制代码
        }
复制代码
        if (ch == '(') {
复制代码
            opStack.push('(');
复制代码
            i++;
复制代码
            continue;
复制代码
        }
复制代码
        if (ch == ')') {
复制代码
            while (!opStack.isEmpty() && opStack.top() != '(') {
复制代码
                char op = opStack.pop();
复制代码
                double b = valStack.pop();
复制代码
                double a = valStack.pop();
复制代码
                valStack.push(applyOp(a, b, op));
复制代码
            }
复制代码
            if (!opStack.isEmpty() && opStack.top() == '(')
复制代码
                opStack.pop();
复制代码
            i++;
复制代码
            continue;
复制代码
        }
复制代码
        if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
复制代码
            if (ch == '-' && (i == 0 || opt[i-1] == '(')) {
复制代码
                char* end;
复制代码
                double num = strtod(opt + i, &end);
复制代码
                valStack.push(num);
复制代码
                i = end - opt;
复制代码
                continue;
复制代码
            }
复制代码
            while (!opStack.isEmpty() && opStack.top() != '(' &&
复制代码
                   priority(ch) <= priority(opStack.top())) {
复制代码
                char op = opStack.pop();
复制代码
                double b = valStack.pop();
复制代码
                double a = valStack.pop();
复制代码
                valStack.push(applyOp(a, b, op));
复制代码
            }
复制代码
            opStack.push(ch);
复制代码
            i++;
复制代码
            continue;
复制代码
        }
复制代码
        i++;
复制代码
    }
复制代码
    while (!opStack.isEmpty()) {
复制代码
        char op = opStack.pop();
复制代码
        if (op == '(') {
复制代码
            ui->mainlineEdit->setText("Error");
复制代码
            return;
复制代码
        }
复制代码
        if (valStack.size() < 2) {
复制代码
            ui->mainlineEdit->setText("Error");
复制代码
            return;
复制代码
        }
复制代码
        double b = valStack.pop();
复制代码
        double a = valStack.pop();
复制代码
        valStack.push(applyOp(a, b, op));
复制代码
    }
复制代码
    if (valStack.size() != 1) {
复制代码
        ui->mainlineEdit->setText("Error");
复制代码
        return;
复制代码
    }
复制代码
    double result = valStack.pop();
复制代码
    QString resultStr;
复制代码
    if (std::abs(result - std::round(result)) < 1e-9)
复制代码
        resultStr = QString::number(static_cast<long long>(result));
复制代码
    else
复制代码
        resultStr = QString::number(result, 'g', 10);
复制代码
复制代码
    ui->mainlineEdit->setText(resultStr);
复制代码
    expression.clear();       // 清空成员变量,避免下次累加
复制代码
    needClear = true;         // 下次输入自动清屏
复制代码
}

之后计算器能正常使用!!!

5、QObject定时器

实现电子相册的功能:1s切换一张图片

在头文件中添加宏定义:

复制代码
#define TIMEOUT (1*1000)//ms是单位

并添加图片编号、定时器编号以及一个公开函数(名字一定要写对!timerEvent):

复制代码
public:
复制代码
    Widget(QWidget *parent = nullptr);
复制代码
    virtual void timerEvent(QTimerEvent *event);
复制代码
    ~Widget();
复制代码
private slots:
复制代码
    void on_startButton_clicked();
复制代码
private:
复制代码
    Ui::Widget *ui;
复制代码
    int myTimerid;//定时器编号
复制代码
    int pictureId;//图片编号
复制代码
};

之后在ui界面中添加两个push button按钮:

并在开始按钮右键转为槽,其中开始按钮的命名为startButton,暂停按钮的命名为stopButton

再添加一个label:

之后在cpp文件中:

复制代码
#include "widget.h"
复制代码
#include "ui_widget.h"
复制代码
Widget::Widget(QWidget *parent)
复制代码
    : QWidget(parent)
复制代码
    , ui(new Ui::Widget)
复制代码
{
复制代码
    ui->setupUi(this);
复制代码
    pictureId=2;
复制代码
    QPixmap pix("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\QobjectTimer\\1.jpg");
复制代码
    ui->label->setPixmap(pix);
复制代码
}
复制代码
Widget::~Widget()
复制代码
{
复制代码
    delete ui;
复制代码
}
复制代码
void Widget::on_startButton_clicked()
复制代码
{
复制代码
    //开启定时器,返回编号
复制代码
    myTimerid=this->startTimer(TIMEOUT);
复制代码
}
复制代码
void Widget::timerEvent(QTimerEvent *event){
复制代码
    if(event->timerId()!=myTimerid)
复制代码
        return;
复制代码
    QString path("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\QobjectTimer\\");
复制代码
    path+=QString::number(pictureId);
复制代码
    path+=".jpg";
复制代码
    QPixmap pix(path);
复制代码
    ui->label->setPixmap(pix);
复制代码
    pictureId++;
复制代码
    if(pictureId==5)//目前只有4张图片,一旦超过四张就重新返回第一张
复制代码
        pictureId=1;
复制代码
}
复制代码
选中label之后,右下角处勾选这个,使得所有图片都适配label框!

运行程序,点击开始之后,结果如下:

1s换一张图片

之后对暂停按钮转向槽:

添加一句代码:

this->killTimer(myTimerid);

结果如下:点击开始就开始播放,暂停则停止播放

6、QTime定时器

新创建一个项目,命名为QTimer

头文件如下:

复制代码
#ifndef WIDGET_H
复制代码
#define WIDGET_H
复制代码
#include <QWidget>
复制代码
#include<QTimer>
复制代码
#define TIMEOUT (1*1000)
复制代码
QT_BEGIN_NAMESPACE
复制代码
namespace Ui { class Widget; }
复制代码
QT_END_NAMESPACE
复制代码
class Widget : public QWidget
复制代码
{
复制代码
    Q_OBJECT
复制代码
public:
复制代码
    Widget(QWidget *parent = nullptr);
复制代码
    ~Widget();
复制代码
private slots:
复制代码
    void on_pushButton_clicked();
复制代码
    void timeoutSlot();
复制代码
    void on_pushButton_2_clicked();
复制代码
private:
复制代码
    Ui::Widget *ui;
复制代码
    QTimer *timer;
复制代码
    int pictureID;
复制代码
};
复制代码
#endif // WIDGET_H

cpp文件如下:

复制代码
#include "widget.h"
复制代码
#include "ui_widget.h"
复制代码
Widget::Widget(QWidget *parent)
复制代码
    : QWidget(parent)
复制代码
    , ui(new Ui::Widget)
复制代码
{
复制代码
    ui->setupUi(this);
复制代码
    timer=new QTimer;
复制代码
    pictureID=2;
复制代码
    QImage img;
复制代码
    img.load("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\QTimer\\1.jpg");
复制代码
    ui->label->setPixmap(QPixmap::fromImage(img));
复制代码
    connect(timer,&QTimer::timeout,this,&Widget::timeoutSlot);//定时器时间到发出timeout信号
复制代码
}
复制代码
Widget::~Widget()
复制代码
{
复制代码
    delete ui;
复制代码
}
复制代码
void Widget::on_pushButton_clicked()
复制代码
{
复制代码
    timer->start(TIMEOUT);
复制代码
}
复制代码
void Widget::timeoutSlot()
复制代码
{
复制代码
    QString path("C:\\Users\\xzhao\\Desktop\\daima\\QTOnline\\QTimer\\");
复制代码
    path+=QString::number(pictureID);
复制代码
    path+=(".jpg");
复制代码
    QImage img;
复制代码
    img.load(path);
复制代码
    ui->label->setPixmap(QPixmap::fromImage(img));
复制代码
    pictureID++;
复制代码
    if(pictureID==5)
复制代码
        pictureID=1;
复制代码
}
复制代码
void Widget::on_pushButton_2_clicked()
复制代码
{
复制代码
    timer->stop();
复制代码
}
复制代码
运行后结果与上述一致

QTimer可以实现单次点击,在界面中新增一个单次的按钮,点击按钮后,等待1s后只运行一次程序(只换一次照片):

复制代码
相关推荐
晓梦林1 小时前
bughush靶场学习笔记
笔记·学习
weixin_446260851 小时前
[特殊字符] 从弱点中学习:小计算使用智能体的自动领域专业化
人工智能·学习
wuxinyan1232 小时前
工业级大模型学习之路029:解决双智能体调用数据库报错问题
数据库·人工智能·python·学习·智能体
SunnyDays10112 小时前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
Yyyyyy~2 小时前
【C++】数组篇
开发语言·c++
牛肉在哪里2 小时前
ros2 从零开始27 编写广播C++
开发语言·c++·机器人
yong99902 小时前
基于Qt的文件传输系统
开发语言·qt
yuan199972 小时前
基于 MATLAB PSO 工具箱的函数寻优算法
开发语言·算法·matlab
sakiko_2 小时前
Swift学习笔记34-MVC架构,SwiftUI与UIkit混编练习
笔记·学习·swiftui·mvc·swift