QT——tableWidget-跳变之舞V1.0-记录学习【1】

news/2024/9/8 5:25:44/ 标签: qt, 学习, 开发语言, c++

QT——tableWidget-跳变之舞V1.0-记录学习【1】


文章目录

  • QT——tableWidget-跳变之舞V1.0-记录学习【1】
  • 前言
  • 一、利用QT创建项目文件
    • 1.1 完整项目文件如下图所示:
    • 1.2 演示:
  • 二、声明文件:
    • 2.1 主界面声明文件:mainwindow.h;
    • 2.2 控制窗口声明文件:form.h;
    • 2.3 线程声明文件:mythread.h;
  • 三、源文件:业务逻辑实现
    • 3.1 主界面逻辑文件:mainwindow.cpp;
    • 3.2 控制窗口逻辑文件:form.cpp;
    • 3.3 线程逻辑文件:mythread.cpp;
    • 3.4 主界面监控及显示:main.cpp;
  • 四、UI设计文件:
    • 4.1 控制窗口UI文件form.ui;
    • 4.2 主界面UI文件mainwindow.ui;
  • 五、qrc资源文件:
  • 六、个人初步理解QT信号与槽函数的建立及通讯;
    • 演示:


前言

学习QT-tableWidge的部分使用方法,自制跳变表格娱乐小工具 V1.0(* ̄︶ ̄)


一、利用QT创建项目文件

备注:此处不讲解如何新建项目,创建项目。

1.1 完整项目文件如下图所示:

在这里插入图片描述

  1. Headers文件夹下的文件为头文件,主要是声明定义文件;
  2. Sources文件夹下的文件为源文件,主要是功能实现文件;
  3. Forms文件夹下的文件为ui文件,主要是UI设计文件;
  4. Resources文件夹下的文件为qrc文件,主要是放入资源文件;
  5. Other files文件夹下的文件为其他文件;

1.2 演示:

在这里插入图片描述


二、声明文件:

包括:主界面声明文件:mainwindow.h,控制窗口声明文件:form.h,线程声明文件:mythread.h;

2.1 主界面声明文件:mainwindow.h;

//这段代码的作用是防止头文件的重复包含,确保在编译过程中每个源文件只包含一次该头文件。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <form.h>
#include <mythread.h>//QT_BEGIN_NAMESPACE是Qt框架中的一个宏定义,用于定义一个命名间。
QT_BEGIN_NAMESPACE
//C++中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域
namespace Ui { class MainWindow; }
QT_END_NAMESPACE//类
class MainWindow :public QMainWindow //关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。
{Q_OBJECT //Q_OBJECT是Qt框架中用于支持信号与槽机制、动态属性和反射等特性的宏定义。public://带有一个参数的构造函数,参数类型为QWidget指针,参数名为parent。构造函数使用了默认参数值nullptr,表示如果没有传递参数,则parent将被设置为nullptr。MainWindow(QWidget *parent = nullptr);//这是一个默认析构函数,没有任何参数。析构函数在对象被销毁时自动调用,用于释放对象所占用的资源。~MainWindow();//覆写closeEvent函数void closeEvent(QCloseEvent *);// private slots是Qt框架中的一种特殊声明,用于定义私有的槽函数。槽函数是用于响应信号的函数,而私有的槽函数只能在类内部被调用。private slots:void onMenuButtonClicked();void getStr(QString &,QString &,QString &);private://Ui::MainWindow是一个类,通常用于设计和管理主窗口的用户界面。//一个指向MainWindow类的对象的指针Ui::MainWindow *ui;private:Form *configWindow = new Form;void onshuju();private:void settable();void addrowcolum(QString &,QString &,QString &);private:void returnNumber();void tiaobian();void threadqidong(int value);MyThread *thread = new MyThread;//创建信号signals:void mainWidgetStr(QString &,QString &);//创建槽函数private slots:void tiaobiansloat(int value);};
#endif // MAINWINDOW_H

2.2 控制窗口声明文件:form.h;

#ifndef FORM_H
#define FORM_H#include <QWidget>namespace Ui {
class Form;
}class Form : public QWidget
{Q_OBJECTpublic:explicit Form(QWidget *parent = nullptr);~Form();private slots:void on_pushButton_clicked();void mainWidgetStr(QString &str,QString &strs);void on_pushButton_3_clicked();void on_pushButton_2_clicked();private:Ui::Form *si;private:void show_ui();signals:void setStr(QString &str,QString &strs,QString &);
};#endif // FORM_H

2.3 线程声明文件:mythread.h;

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>class MyThread : public QThread
{Q_OBJECTpublic:explicit MyThread(QObject *parent = 0);void stop();void sleeptimeset(int);protected:void run();private:volatile bool stopped;signals:void sendinfo(int);
};#endif // MYTHREAD_H

三、源文件:业务逻辑实现

包括:主界面逻辑文件:mainwindow.cpp,控制窗口逻辑文件:form.cpp,线程逻辑文件:mythread.cpp,主界面监控:main.cpp;

3.1 主界面逻辑文件:mainwindow.cpp;

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>  //C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息
#include "form.h"
#include "qmessagebox.h"
#include "qevent.h"
#include "QTableWidget"
#include <QTableWidgetItem>
#include <QIcon>
#include <QDir>
#include <QDebug>
#include <QRandomGenerator>//using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念
using namespace std;int ret = 1;
int randomNumber0 = 0;
int randomNumber1 = 0;
int randomNumber2 = 0;
int numbers =0;
char a[12] = { 0 }; //是一个长度为12的字符数组,并且数组中每个元素都被初始化为0。
double decimalNum = 0.1;MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow)//MainWindow::MainWindow(QWidget *parent)构造函数的作用是创建MainWindow类的对象,并初始化其UI界面{ui->setupUi(this);  //初始化UI// 连接信号和槽//ui->tool是一个指向用户界面中的工具按钮的指针。&QAction::triggered是一个信号,表示当工具按钮被触发时发出的信号。//this是指向当前窗口对象的指针,而MainWindow::onMenuButtonClicked是一个槽函数,表示当工具按钮被触发时要执行的函数。connect(ui->tool, &QAction::triggered, this, &MainWindow::onMenuButtonClicked);/*configWindow为发出信号的对象,SIGNAL(setStr(QString&))为信号,this为接收信号的对象,SLOT(getStr(QString&))为槽函数。* 意思是当configWindow对象发送setStr信号时,this对象的getStr槽函数将被调用,并且会传递一个QString类型的参数。* 这种机制使得对象间的通信更加灵活方便。*/connect(configWindow,SIGNAL(setStr(QString&,QString &,QString &)), this, SLOT(getStr(QString&,QString &,QString &)));//连接信号和槽函数connect(thread,SIGNAL(sendinfo(int)), this, SLOT(tiaobiansloat(int)));// 设置窗口标题this->setWindowTitle("QT5.1 ");this->setWindowIcon((QIcon(":/build-00000-Desktop_Qt_5_14_2_MinGW_64_bit-Release/main.jpg")));settable();//获取坐标// 获取窗口四个角的坐标QRect rect = this->geometry();  // 获取窗口位置和大小int x1 = rect.x();              // 左上角x坐标int y1 = rect.y();              // 左上角y坐标int x2 = x1 + rect.width();     // 右上角x坐标int y2 = y1;                    // 右上角y坐标
//    int x3 = x2;                    // 右下角x坐标
//    int y3 = y1 + rect.height();    // 右下角y坐标
//    int x4 = x1;                    // 左下角x坐标
//    int y4 = y3;                    // 左下角y坐标qDebug() <<"右上角x,y坐标:"<<x2 <<y2 ;this->move(500,250);     //窗口打开位置设置
}void MainWindow::onshuju()
{if (ret == 0){configWindow->show();cout<<  "open new window" << endl;}else{configWindow->close();cout<<  "close new window" << endl;}}void MainWindow::getStr(QString &str,QString &strs,QString &text)
{qDebug() << "主界面接收数据:"<< str << strs <<text;addrowcolum(str,strs,text);//发送信号到控制窗口//emit mainWidgetStr(str,strs);//将字符串转为浮点数decimalNum = str.toDouble();//跳变业务逻辑启动控制if(strs == "start_putton"){qDebug() << "启动按钮....";threadqidong(1);}else if (strs == "stop_putton"){qDebug() << "停止按钮....";threadqidong(2);}}void MainWindow::addrowcolum(QString &str1,QString &str2,QString &text)
{int shuju = str2.toInt();if (text== "增加" and str1 == "列设置"){for(int shuzhi=0;shuzhi<shuju;shuzhi++){int number = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(number);}}else if ((text== "增加" and str1 == "行设置")){for(int shuzhi=0;shuzhi<shuju;shuzhi++){int number = ui->tableWidget->rowCount();ui->tableWidget->insertRow(number);}}else if ((text== "删除" and str1 == "行设置")){for(int shuzhi=0;shuzhi<shuju;shuzhi++){int number = ui->tableWidget->rowCount();ui->tableWidget->removeRow(number-1);}}else if ((text== "删除" and str1 == "列设置")){for(int shuzhi=0;shuzhi<shuju;shuzhi++){int number = ui->tableWidget->columnCount();ui->tableWidget->removeColumn(number-1);}}
}void MainWindow::tiaobiansloat(int value)
{// qDebug()<< "设置睡眠时间:" <<decimalNum;// 设置睡眠时间thread->sleeptimeset(decimalNum*1000);tiaobian();}void MainWindow::threadqidong(int value)
{if (value == 1){qDebug() << "启动线程...";//启用线程thread->start();}else if(value == 2){qDebug() << "停止线程...";thread->stop();}
}void MainWindow::tiaobian()
{QTableWidgetItem *item;for(int row = 0; row < ui->tableWidget->rowCount(); row++){for(int column = 0; column < ui->tableWidget->columnCount(); column++){item = new QTableWidgetItem();item->setTextAlignment(Qt::AlignCenter); //居中returnNumber();item->setBackground(QColor(randomNumber0, randomNumber1, randomNumber2));  //设置颜色//设置单元格内容item->setText(a);//qDebug() << "Number: " << a;ui->tableWidget->setItem(row, column, item);}}
}void MainWindow::onMenuButtonClicked()
{ret = 0;cout << "===start Sucess=====" << endl;connect(this,SIGNAL(mainWidgetStr(QString&,QString &)), configWindow, SLOT(mainWidgetStr(QString&,QString &)));onshuju();ret = 1;
}void MainWindow::closeEvent(QCloseEvent *event)
{// 在这里编写关闭窗口时的处理逻辑QMessageBox::StandardButton button = QMessageBox::question(this, "确认关闭", "确定要关闭窗口吗?", QMessageBox::Yes | QMessageBox::No);if (button == QMessageBox::Yes){onshuju();// 用户确认关闭窗口,调用父类的closeEvent()函数关闭窗口event->accept();}else {// 用户取消关闭窗口,忽略该事件event->ignore();}
}void MainWindow::settable()
{//设置表格表头的样式ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightblue;}");ui->tableWidget->resizeColumnsToContents();//自动调整表格控件的列宽,使得表格中的内容能够全部显示出来。ui->tableWidget->resizeRowsToContents();  //用于自动调整表格控件的行高,使得表格中的内容能够全部显示出来ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//Qt中设置表格控件中表头自适应宽度的方法之一。//水平表头栏的单元格大小模式为拉伸模式,即根据控件的大小自动调整每一列的宽度,使得每一列的宽度都相等。这种设置可以使得表格数据更加美观和易于查看。ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); //将第一列的宽度调整为其内容的宽度。ui->tableWidget->setWordWrap(true);//设置表格控件的自适应行高属性为true//设置所有内容居中QTableWidgetItem *item; //指向QTableWidgetItem对象的指针for(int row = 0; row < ui->tableWidget->rowCount(); row++){for(int column = 0; column < ui->tableWidget->columnCount(); column++){item = new QTableWidgetItem();item->setTextAlignment(Qt::AlignCenter); //居中returnNumber();item->setBackground(QColor(randomNumber0, randomNumber1, randomNumber2));  //设置颜色//设置单元格内容item->setText(a);//qDebug() << "Number: " << a;ui->tableWidget->setItem(row, column, item);}}// 禁止编辑单元格ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);QString path = QDir::currentPath();//打印工作路径qDebug() << path;//获取表格长度和宽度int width1 = ui->tableWidget->width();int height1 = ui->tableWidget->height();cout<<"width:" << width1 <<endl;cout<<"height:" << height1 <<endl;ui->tableWidget->verticalHeader()->setDefaultSectionSize(30); //设置所有行的高度cout<<"table edit over!" << endl;
}void MainWindow::returnNumber()
{// 生成一个介于0到256之间的随机数randomNumber0 = QRandomGenerator::global()->bounded(256);randomNumber1 = QRandomGenerator::global()->bounded(256);randomNumber2 = QRandomGenerator::global()->bounded(256);//    qDebug() << "Random Number: " << randomNumber1;//    qDebug() << "Random Number: " << randomNumber2;numbers = QRandomGenerator::global()->bounded(11);//将整数类型的变量numbers格式化成字符串类型,然后将格式化后的字符串存储到字符数组a中。//其中,第二个参数12表示字符数组a的大小,第三个参数"%d"表示将整数按十进制格式输出到字符串中。//如果格式化后的字符串长度超过了11个字符(包括’\0’),则会在字符数组a的末尾加上’\0’截断字符串,确保不会发生溢出。snprintf(a,12,"%d",numbers);}MainWindow::~MainWindow()
{//delete ui; 是一个用于释放动态分配的内存的操作。在C++中,//当我们使用new关键字创建一个对象时,需要使用delete关键字来释放这个对象所占用的内存空间,以防止内存泄漏。cout << "relase neicun" << endl;delete ui;}

3.2 控制窗口逻辑文件:form.cpp;

#include "form.h"
#include "ui_form.h"
#include <iostream>  //C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息
#include <QDebug>using namespace std;/*控制窗口 */Form::Form(QWidget *parent) :QWidget(parent),si(new Ui::Form)
{si->setupUi(this);this->setWindowIcon((QIcon(":/build-00000-Desktop_Qt_5_14_2_MinGW_64_bit-Release/form.jpg")));this->move(1268,250);     //窗口打开位置设置this->setWindowTitle("控制窗口 ");
}Form::~Form()
{cout<<"close Form" << endl;delete si;
}void Form::on_pushButton_clicked(){QString text = si->pushButton->text();//获取设置项QString sets = si->comboBox_2->currentText();//获取行数据QString a = si->comboBox->currentText();//发送信号到主界面emit setStr(sets,a,text);}void Form::mainWidgetStr(QString &str,QString &strs)
{qDebug() << "控制窗口接收数据:" << strs << str;
}void Form::show_ui()
{this->show();}//启动跳变
void Form::on_pushButton_3_clicked()
{QString text = si->pushButton_3->text();if (text == "启动"){QString sets = "start_putton";//获取跳变速度QString a = si->comboBox_3->currentText();//发送信号到主界面emit setStr(a,sets,text);si->pushButton_3->setText("停止");si->pushButton->setDisabled(true);si->pushButton_2->setDisabled(true);}else if (text == "停止") {QString sets = "stop_putton";//获取跳变速度QString a = si->comboBox_3->currentText();//发送信号到主界面emit setStr(a,sets,text);si->pushButton_3->setText("启动");si->pushButton->setDisabled(false);si->pushButton_2->setDisabled(false);}}void Form::on_pushButton_2_clicked()
{QString text = si->pushButton_2->text();//获取设置项QString sets = si->comboBox_2->currentText();//获取行数据QString a = si->comboBox->currentText();//发送信号到主界面emit setStr(sets,a,text);
}

3.3 线程逻辑文件:mythread.cpp;

#include "mythread.h"int timeset = 200;MyThread::MyThread(QObject *parent) :QThread(parent)
{stopped = false;
}void MyThread::run()
{stopped = false;int shuju = 1;while (!stopped) {QThread::msleep(timeset);  // 休眠时间设置;emit sendinfo(shuju);}
}void MyThread::stop()
{stopped = true;
}void MyThread::sleeptimeset(int value=200)
{timeset = value;
}

3.4 主界面监控及显示:main.cpp;

#include "mainwindow.h"
#include "form.h"
#include <QApplication>/* QApplication应用程序类管理图形用户界面应用程序的控制流和主要设置。是Qt生命,一个程序要确保一直运行,就肯定至少得有一个循环,这就是Qt主消息循环,在其中完成来自窗口系统和其它资源的所有事件消息处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication 对象,不论这个应用程序在同一时刻有多少个窗口。*///主界面监控int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;       //继承UIw.show();           //显示界面// 程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。return a.exec();
}

四、UI设计文件:

包括:主界面UI文件mainwindow.ui;控制窗口UI文件form.ui

4.1 控制窗口UI文件form.ui;

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Form</class><widget class="QWidget" name="Form"><property name="geometry"><rect><x>0</x><y>0</y><width>392</width><height>214</height></rect></property><property name="windowTitle"><string>Form</string></property><layout class="QVBoxLayout" name="verticalLayout"><item><widget class="QGroupBox" name="groupBox"><property name="title"><string>控制窗口</string></property><layout class="QGridLayout" name="gridLayout_2"><item row="0" column="4"><widget class="QPushButton" name="pushButton"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton:hover
{
background-color: rgb(30, 144, 255);
}
QPushButton:pressed
{
background-color: #FFFF00; /*伪状态经过时背景色*/ 
border-style: inset;
}
QPushButton:!enabled{
background-color: rgb(100, 100, 100);
border-style: inset;
}
</string></property><property name="text"><string>增加</string></property></widget></item><item row="0" column="5"><widget class="QPushButton" name="pushButton_2"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton:hover
{
background-color: rgb(30, 144, 255);
}
QPushButton:pressed
{
background-color: #FFFF00; /*伪状态经过时背景色*/ 
border-style: inset;
}
QPushButton:!enabled{
background-color: rgb(100, 100, 100);
border-style: inset;
}
</string></property><property name="text"><string>删除</string></property></widget></item><item row="0" column="1"><widget class="QComboBox" name="comboBox_2"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">background-color: #F5F5F5;
QComboBox QAbstractItemView::item{
height:36px;
color:#666666;
padding-left:9px;
background-color:#FFFFFF;
}
QComboBox QAbstractItemView::item:hover{ //悬浮
background-color:#409CE1;
color:#ffffff;
}
QComboBox QAbstractItemView::item:selected{//选中
background-color:#409CE1;
color:#ffffff;
}</string></property><item><property name="text"><string>列设置</string></property></item><item><property name="text"><string>行设置</string></property></item></widget></item><item row="0" column="3"><widget class="QComboBox" name="comboBox"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">background-color: #F5F5F5;
QComboBox QAbstractItemView::item{
height:36px;
color:#666666;
padding-left:9px;
background-color:#FFFFFF;
}
QComboBox QAbstractItemView::item:hover{ //悬浮
background-color:#409CE1;
color:#ffffff;
}
QComboBox QAbstractItemView::item:selected{//选中
background-color:#409CE1;
color:#ffffff;
}</string></property><item><property name="text"><string>1</string></property></item><item><property name="text"><string>2</string></property></item><item><property name="text"><string>3</string></property></item></widget></item><item row="1" column="1"><widget class="QLabel" name="label"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="frameShape"><enum>QFrame::Panel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property><property name="text"><string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;跳变速度:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property></widget></item><item row="1" column="4"><widget class="QPushButton" name="pushButton_3"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton:hover
{
background-color: rgb(30, 144, 255);
}
QPushButton:pressed
{
background-color: #FFFF00; /*伪状态经过时背景色*/ 
border-style: inset;
}
QPushButton:!enabled{
background-color: rgb(100, 100, 100);
border-style: inset;
}
</string></property><property name="text"><string>启动</string></property></widget></item><item row="1" column="3"><widget class="QComboBox" name="comboBox_3"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">background-color: #F5F5F5;
QComboBox QAbstractItemView::item{
height:36px;
color:#666666;
padding-left:9px;
background-color:#FFFFFF;
}
QComboBox QAbstractItemView::item:hover{ //悬浮
background-color:#409CE1;
color:#ffffff;
}
QComboBox QAbstractItemView::item:selected{//选中
background-color:#409CE1;
color:#ffffff;
}</string></property><item><property name="text"><string>0.2</string></property></item><item><property name="text"><string>0.5</string></property></item><item><property name="text"><string>1</string></property></item><item><property name="text"><string>2</string></property></item><item><property name="text"><string>3</string></property></item></widget></item></layout></widget></item></layout></widget><resources/><connections/>
</ui>

4.2 主界面UI文件mainwindow.ui;

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>768</width><height>468</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><layout class="QGridLayout" name="gridLayout"><item row="0" column="0"><widget class="QTableWidget" name="tableWidget"><row><property name="text"><string>0</string></property></row><row><property name="text"><string>1</string></property></row><row><property name="text"><string>3</string></property></row><row><property name="text"><string>4</string></property></row><row><property name="text"><string>5</string></property></row><row><property name="text"><string>6</string></property></row><row><property name="text"><string>7</string></property></row><row><property name="text"><string>8</string></property></row><row><property name="text"><string>9</string></property></row><row><property name="text"><string>10</string></property></row><row><property name="text"><string>11</string></property></row><row><property name="text"><string>12</string></property></row><column><property name="text"><string>1</string></property></column><column><property name="text"><string>2</string></property></column><column><property name="text"><string>3</string></property></column><column><property name="text"><string>4</string></property></column><column><property name="text"><string>5</string></property></column><column><property name="text"><string>6</string></property></column><column><property name="text"><string>7</string></property></column><item row="0" column="0"><property name="text"><string/></property><property name="toolTip"><string extracomment="123"/></property></item></widget></item></layout></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>768</width><height>23</height></rect></property><widget class="QMenu" name="menu"><property name="title"><string>控制工具</string></property><addaction name="tool"/></widget><addaction name="menu"/></widget><widget class="QStatusBar" name="statusbar"/><action name="tool"><property name="text"><string>Start_tool</string></property></action></widget><resources/><connections/>
</ui>

五、qrc资源文件:

注明:qrc文件基本就是添加图片之类的资源文件,设置界面图标,背景图片之类的,此处不多赘述!

六、个人初步理解QT信号与槽函数的建立及通讯;

演示:

在这里插入图片描述

前提:可以建立信号和槽函数
1、在1号头文件中,先声明一个信号,在对应1号源文件中创建一个emit信号;
在这里插入图片描述

2、在2号头文件中,new一个指向1号源文件中类的指针,并创建连接信号与槽函数的关系;
3、槽函数在2号头文件中先声明,然后再在源文件中创建一个槽函数。在这里插入图片描述


http://www.ppmy.cn/news/1461854.html

相关文章

Python中数据库操作pymysql和 sqlalchemy

在python中操作mysql数据库&#xff0c;主要用到两个库&#xff0c;pymysql和 sqlalchemy。分别进行介绍 安装 安装没啥好说的&#xff0c;其实就是pip install就完事 pip install pymysql pip install sqlalchemypymsql操作数据库 创建连接 以下语句省略了import语句&…

计算机网络-负载均衡算法

计算机网络中的负载均衡算法是决定如何将请求分发到各个服务器的关键。目前负载均衡算法主要分为静态负载均衡算法和动态负载均衡算法&#xff0c;具体包括以下几种&#xff1a; 静态负载均衡算法&#xff1a; 1.轮询法&#xff08;Round Robin&#xff09;&#xff1a;按照顺…

Ardupilot Rpanion iperf网络性能测试

Ardupilot Rpanion iperf网络性能测试 1. 源由2. 分析3. 安装4. 测试4.1 第一次测试4.1.1 iperf测试参数A4.1.1.1 测试链路14.1.1.2 测试链路24.1.1.3 测试链路3 4.1.2 iperf测试参数B - 测试链路34.1.2.1 测试数据4.1.2.2 数据简单分析4.1.2.3 数据深入分析4.1.2.4 模拟测试网…

element-plus 工作经验总结

Element-plus 文章目录 Element-plus忠告: 最好锁定版本, 免得更新更出 BUG 来了el-drawer 设置 modal"false" 后, 遮罩元素仍存在, 点不了空白的地方el-tree 大数据量时接收 check-change 事件报错导致涉及多个节点的操作没执行完毕el-table 表头 show-overflow-too…

Linux---编辑器vim的认识与简单配置

前言 我们在自己的电脑上所用的编译软件&#xff0c;就拿vs2022来说&#xff0c;我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译&#xff0c;这种既可以用来编辑、运行编译&#xff0c;又可以支持很多种语言的编译器是一种集成式开发环境&#xff0c;集众多于…

软件设计师笔记和错题

笔记截图 数据库 模式是概念模式 模式/内模式 存在概念级和内部级之间&#xff0c;实现了概念模式和内模式的互相转换 外模式/模式映像 存在外部级和概念级之间&#xff0c;实现了外模式和概念模式的互相转换。 数据的物理独立性&#xff0c; 概念模式和内模式之间的映像…

WordPress原创插件:超链接点击访问统计

WordPress原创插件&#xff1a;超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

DockerFile介绍与使用

一、DockerFile介绍 大家好&#xff0c;今天给大家分享一下关于 DockerFile 的介绍与使用&#xff0c;DockerFile 是一个用于定义如何构建 Docker 镜像的文本文件&#xff0c;具体来说&#xff0c;具有以下重要作用&#xff1a; 标准化构建&#xff1a;提供了一种统一、可重复…

Shell脚本——批量清理Kubernetes集群中Evicted状态的pod

测试环境有一台宿主机出现了异常&#xff0c;大量的异常日志导致宿主机的磁盘使用率超过了85%&#xff0c;触发了上面的pod驱离策略&#xff0c;该宿主机上的的pod处于Evicted状态。在清理了磁盘之后&#xff0c;得手动处理掉这些Evicted状态的pod。 #!/bin/bash# 获取当前状态…

HCIP【VLAN综合实验】

目录 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、在交换机SW1,SW2,SW3配置VLAN和各个接口对应类型的配置 2、在路由器上面配置DHCP服务 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 1、PC1 …

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像&#xff0c;由于波段数量、图像位深度等原因&#xff0c;TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例&#xff0c;制作能够直接用…

MongoDB聚合运算符:$trunc

MongoDB聚合运算符&#xff1a;$trunc 文章目录 MongoDB聚合运算符&#xff1a;$trunc语法参数字段 使用返回的数据类型null, NaN, 和 正/负无穷 举例 $trunc聚合运算符用于将数字截断为整数或指定的小数位。 语法 { $trunc : [ <number>, <place> ] }参数字段 &…

SSM【Spring SpringMVC Mybatis】—— Spring(一)

目录 1、初识Spring 1.1 Spring简介 1.2 搭建Spring框架步骤 1.3 Spring特性 1.5 bean标签详解 2、SpringIOC底层实现 2.1 BeanFactory与ApplicationContexet 2.2 图解IOC类的结构 3、Spring依赖注入数值问题【重点】 3.1 字面量数值 3.2 CDATA区 3.3 外部已声明be…

关键字详解

1.用于定义访问权限修饰符的关键字 面向对象程序三大特性&#xff1a;封装、继承、多态。 1.1 访问权限符 Java 中主要通过类和访问权限来实现封装&#xff1a; 类可以将数据以及封装数据的方法结合在一起 &#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努…

BERT for Joint Intent Classification and Slot Filling 论文阅读

BERT for Joint Intent Classification and Slot Filling 论文阅读 Abstract1 Introduction2 Related work3 Proposed Approach3.1 BERT3.2 Joint Intent Classification and Slot Filling3.3 Conditional Random Field 4 Experiments and Analysis4.1 Data4.2 Training Detail…

软件工程期末复习(7)需求过程

需求分析 需求过程 什么是需求过程&#xff1f; 需求过程是用来导出、确认和维护系统需求文档的一组结构化活动。通常&#xff0c;一个良好的需求过程应包括下列活动&#xff1a; 需求提取需求分析和协商需求确认 需求提取 需求提取是通过与客户、系统用户和其他与系统开发相…

Linux的常用指令 和 基础知识穿插巩固(巩固知识必看)

目录 前言 ls ls 扩展知识 ls -l ls -a ls -al cd cd 目录名 cd .. cd ~ cd - pwd 扩展知识 路径 / cp [选项] “源文件名” “目标文件名” mv [选项] “源文件名” “目标文件名” rm 作用 用法 ./"可执行程序名" mkdir rmdir touch m…

QMetaObject 是 Qt 框架中的一个重要类,用于在运行时处理对象的元对象信息

QMetaObject 是 Qt 框架中的一个重要类&#xff0c;用于在运行时处理对象的元对象信息。每个继承自 QObject 的类在 Qt 中都有一个对应的 QMetaObject&#xff0c;用于存储该类的元对象信息&#xff0c;包括类名、父类、信号和槽等。 以下是 QMetaObject 类的一些主要功能和用…