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

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.mzph.cn/news/835346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技查新中医学科研项目查新点如何确立与提炼?案例讲解

一、前言 医学科技查新包括立项查新和成果查新两个部分&#xff0c;其中医学立项查新&#xff0c;它是指在医学科研项目申报开题之前&#xff0c;通过在一定范围内进行该课题的相关文献检索 ( 可以根据项目委托人的具体要求&#xff0c;进行国内检索或者进行国外检索 ) &#x…

区块链(打新)如何被割韭菜

看上去&#xff0c;像我只要去每个都买一遍新发行的代币&#xff0c;一定可以成功的 但是好像没有想象中这么简单&#xff0c;因为这些山寨币&#xff0c;庄家可以自己控盘的&#xff0c;看上去好像有跌宕起伏的买卖&#xff0c;但是一单掀桌子&#xff0c;庄家他自己都不玩了…

Python之数据分析基础

导言&#xff1a; “21世纪的竞争是数据的竞争&#xff0c;谁掌握数据&#xff0c;谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合&#xff0c;并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤&#xff0c;再通过python完成实例数据的处理、分析最终展…

TDM(BPM)-MIMO-FMCW雷达MATLAB仿真

本文通过对车载毫米波雷达信号流程和链路的仿真&#xff0c;建立基本的算法框架&#xff0c;可用于算法性能的验证。并提供基础MATLAB仿真代码&#xff0c;作为分享和参考。 一、信号的产生 车载毫米波雷达广泛使用线性调频连续波雷达&#xff0c;也即发射信号频率随时间线性变…

日本OTC机械手维修需要注意哪些问题呢?

随着工业4.0时代的到来&#xff0c;机器人在制造业中的应用越来越广泛。OTC&#xff08;Over The Counter&#xff09;机器人作为工业机器人的一种&#xff0c;以其高效、精准、稳定的特点受到众多企业的青睐。然而&#xff0c;在实际使用过程中&#xff0c;可能会出现一些OTC机…

如何在路由器上做端口映射

假设现在外网有一台ADSL直接拨号上网的电脑&#xff0c;所获得的是公网IP。然后它想访问局域网内的电脑上面的网站&#xff0c;那么就需要在路由器上做端口映射。在路由器上做端口映射的具体规则是&#xff1a;将所有发向自己端口的数据&#xff0c;都转发到内网的计算机。 访…

github删除自己的仓库

测试Github的时候新建了很多仓库&#xff0c;但是后来想删除&#xff0c;找了半天居然没有找到按钮。 我就推测这个删除的功能肯定藏起来了&#xff0c;后来度娘了一下&#xff0c;发现果然在一个比较隐蔽的位置&#xff0c;不知道以后这个功能会不会改到一个比较明显的位置吧…

c++ 归并排序

归并排序是一种遵循分而治之方法的排序算法。它的工作原理是递归地将输入数组划分为较小的子数组并对这些子数组进行排序&#xff0c;然后将它们合并在一起以获得排序后的数组。 简单来说&#xff0c;归并排序的过程就是将数组分成两半&#xff0c;对每一半进行排序&#xff0c…

原子学习笔记5——点亮 LED

一、应用层操控设备的两种方式 应用层如何操控底层硬件&#xff0c;同样也是通过文件 I/O 的方式来实现&#xff0c;设备文件便是各种硬件设备向应用层提供的一个接口&#xff0c;应用层通过对设备文件的 I/O 操作来操控硬件设备&#xff0c;譬如 LCD 显示屏、串口、按键、摄像…

面向对象设计之套路——设计模式

1、总则 面向对象的分析设计编程思想&#xff0c;通过封装、继承、多态把程序的耦合度降低&#xff0c;用设计模式使得程序更加灵活&#xff0c;容易修改&#xff0c;并且易于复用。 让业务逻辑与界面逻辑分开&#xff0c;让它们的耦合度下降&#xff0c;只有分离&#xff0c;…

nginx--FastCGI

CGI 概念 nginx通过与第三方基于协议实现&#xff0c;即通过某种特定协议将客户端请求转发给第三方服务处理&#xff0c;第三方服务器会新建新的进程处理用户的请求&#xff0c;处理完成后返回数据给Nginx并回收进程(下次处理有需要新建)&#xff0c;最后nginx在返回给客户端…

Jenkins流水线部署Maven项目

使用Jenkins的流水线功能&#xff0c;构建部署Java Maven项目&#xff0c;步骤很简单但是不少细节需要注意。 一、安装 Jenkins的安装步骤和流程就不具体描述&#xff0c;这里主要介绍一下安装时要注意的几个问题。 1、Jenkins尽量安装最新的几个版本&#xff0c;否则安装完成…

elixir V2测试网验证器一键部署脚本

实际收益 1、服务器环境 服务器系统:centos 7或者ubuntu 20.04(以上) CPU:2核 内存:4G 硬盘:30G ssd 网络:可靠的 100Mbit 互联网 2、部署脚本 #!/bin/bash set -eif [ "$#" -ne 3 ]; thenecho "Usage:

(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

报错截图 解决方案 1、登录rabbitMQ网址&#xff0c;删除所有队列 2、重启rabbitMQ 亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;

uni-appH5Android混合开发二 || 使用Android Studio打包应用APK

前言&#xff1a; 在上一章节我们已经讲了如何uni-app离线打包Android平台教程&#xff0c;这一章就该来讲讲如何使用Android Studio打包应用APK提供给Android手机安装使用了。 uni-app跨平台框架介绍和快速入门 uni-app跨平台框架介绍和快速入门 第一步、首先打开已经编译好的…

javac编译web项目中的src

对于单个文件的且不引用其他类文件的java源码用javac编译大家都很熟悉即 javac hello.java, 服务器未安装idea&#xff0c;现在在服务器里面直接编译src目录 1 idea项目结构如下 2 web目录为最终部署的代码 WEB-INF下面没有 classes 目录 3 使用javac 编译src javac -encod…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类&#xff1a;队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

六级仔细阅读

画两到三个词&#xff0c;精准定位 要原文和同义都满足才选 先看题目&#xff0c;在看原文&#xff0c;不要先看选项 做不出答案就继续往下读&#xff0c;读出来了就不用继续读了 分清楚是问为什么还是是什么&#xff0c;是什么看前面&#xff0c;为什么看后面 不知道就优先…

力扣HOT100 - 215. 数组中第K个最大元素

解题思路&#xff1a; 快速选择&#xff0c;目标是找出数组中第 k 小&#xff08;或第 k 大&#xff09;的元素&#xff0c;而不是对整个数组进行排序。 &#xff08;需要和快排进行区分&#xff0c;快排的目的是排序&#xff09; 注意&#xff1a; i l - 1, j r 1; 为什…

Spring Boot集成zookeeper快速入门Demo

1.什么是zookeeper&#xff1f; Zookeeper 是一个开源的分布式协调服务&#xff0c;目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。它具有以下特性…