信號槽【QT】

文章目錄

  • 對象樹
  • 字符集
  • 信號槽
  • QT坐標系
  • 信號與槽
    • connect
    • 自定義槽
    • 自定義信號
    • disconnect

對象樹

#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
class MyLabel : public QLabel
{
public:// 構造函數使用帶 QWidget* 版本的.// 確保對象能夠加到對象樹上MyLabel(QWidget * parent);~MyLabel()  ;
};#endif // MYLABEL_H

上述代碼,在 Qt 中不會產生內存泄露。

label 對象會在合適的時候被析構釋放~~(雖然沒有手動寫 delete,確實能釋放)

之所以能夠把對象釋放掉,主要是因為把這個對象是掛到了對象樹上。

在這里插入圖片描述

使用對象樹,把這些內容組織起來,最主要的目的,就是為了能夠在合適的時機 (窗口關閉/銷毀)

把這些對象統一進行釋放.

如果對象樹的某個對象提前銷毀,此時就會導致對應的控件就在界面上不存在了

 #include "mylabel.h"
#include<iostream>
#include<QDebug>
MyLabel::MyLabel(QWidget * parent):QLabel(parent)
{}MyLabel::~MyLabel()
{//打印日志//會出現亂碼//std::cout << "MyLabel 被銷毀!" << std::endl;//QDebug 是 Qt 中的類。又不會直接使用這個類。這個宏,封裝了 QDebug 對象。//直接使用 qDebug() 可以當做 cout來使用qDebug() << "MyLabel 被銷毀!";
}

在這里插入圖片描述

析構函數是執行了,雖然沒有手動 delete,但是由于把 MyLabel 掛到了對象樹上。此時窗口被銷毀的時候,就會自動銷毀對象樹中的所有對象。MyLabel 的析構是執行了

解決亂碼方案:
Qt 中提供了一個 qDebug() 工具,可以完成打印日志的過程。很好的處理字符編碼

QDebug 是 Qt 中的類。又不會直接使用這個類。這個宏,封裝了 QDebug 對象。
直接使用 qDebug() 這個東西就可以當做 cout 來使用。

使用 qDebug,打印的調試日志,是可以統一進行關閉的,qDebug 可以通過編譯開關,來實現一鍵式關閉

字符集

出現亂碼, 就是編碼方式不匹配( 不局限于 C++)

如果字符串本身是 utf8 編碼的,但是終端(控制臺)是按照 gbk 的方式來解析顯示的(拿著 utf8 這里的數值,去查詢 gbk 的碼表),就會出現亂碼

用記事本方式來打開文件,將文件另存為,并查看文件字符集

在這里插入圖片描述

顯示的是 UTF-8,說明這個文件就是 UTF-8 編碼

顯示的是 ANSI,說明這個文件就是 GBK 編碼

信號槽

Qt 中的 connect 是 QObject 這個類提供的靜態函數。這個函數的作用就是 “連接信號和槽”

在 Qt Designer 中創建一個控件時,此時就會給這個控件分配一個 objectName 屬性。這個屬性的值,要求是在界面中得是唯一的(不能重復)

QPushButton :

qmake 在預處理 .ui 文件的時候,就會根據這里的 objectName 生成對應的 C++ 代碼。C++ 代碼中該 QPushButton 對象的變量名字就是這里的 objectName。這個變量就是 ui 屬性中的成員變量。

widget.cpp文件中通過connect連接信號與槽函數

在這里插入圖片描述

通過圖形化界面的方式,實現的按鈕版 hello world

此時按鈕對象,不需要new , new 對象的操作已經是被 Qt 自動生成了
而且這個按鈕對象,已經作為 ui 對象里的一個成員變量了。
也無需作為 Widget 的成員

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->myButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//獲取文本是hello Worldif(ui->myButton->text()  == QString("hello World")){// 當按鈕被點擊之后,就把按鈕中的文本,進行切換ui->myButton->setText("hello qt");}//獲取文本不是hello Worldelse{// 當按鈕被點擊之后,就把按鈕中的文本,進行切換ui->myButton->setText("hello World");}
}

widget.cpp

純代碼方式實現Hello World

純代碼版本:

myButton按鈕對象是new 的
為了保證其他函數中能夠訪問到這個變量,就需要把myButton按鈕對象設定為 Widget 類的成員變量

#include "widget.h"
#include "ui_widget.h"
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this) ;myButton->setText("hello world") ;//將信號與槽函數關聯connect(ui->pushButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}
//槽函數void Widget::handleClick (){//檢查myButton按鈕的當前文本 是否為"hello world"if(myButton->text() == QString("hello world")){myButton->setText("hellp qt") ;}else{myButton->setText("hellp world") ; }}

QT坐標系

在這里插入圖片描述

坐標系的原點 (0, 0) 就是屏幕的左上角 / 窗口的左上角

給 Qt 的某個控件,設置位置,就需要指定坐標。對于這個控件來說,坐標系原點就是相對于父窗口/控件的。

例如:

QPushButton 的父元素/父控件/父窗口 是 QWidget

在這里插入圖片描述

QWidget 沒有父元素 (NULL),就相當于父元素就是整個顯示器桌面了~~

在這里插入圖片描述

信號與槽

Qt 中,談到信號,也是涉及到三個要素

信號源:由哪個控件發出的信號。

信號的類型:用戶進行不同的操作,就可能觸發不同的信號。

例如:點擊按鈕,觸發點擊信號。在輸入框中移動光標,觸發移動光標的信號。勾選一個復選框,選擇一個下拉框,都會觸發出不同的信號。

信號的處理方式:槽(slot),就是函數

Qt 中可以使用 connect 這樣的函數,把一個信號和一個槽關聯起來。后續只要信號觸發了,Qt 就會自動的執行槽函數

槽函數,本質上也是一種"回調函數" (callback)

一定是先把信號的處理方式準備好,再觸發信號

Qt 中,一定是先關聯號信號和槽,然后再觸發這個信號,順序不能顛倒,否則信號就不知道如何處理了

connect

connect,這個函數和 Linux 中TCP的socket 中建立連接的函數,沒有任何關系,只是名字恰巧一樣了。

connect是 QObject 提供的靜態的成員函數。

在這里插入圖片描述

connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection);

sender : 當前信號是哪個控件發出來的

signal : 信號的類型

receiver : 哪個對象(控件)負責處理

method: 這個對象如何處理 (要處理信號的對象提供的成員函數)

type : 很少使用,暫時不考慮

例如:

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton * button      = new QPushButton(this) ;button->setText("關閉") ;button->move(200,300);//close是QWidget內置的槽函數. Widget繼承自QWidget,也就繼承了QWidget的槽函數.//close:關閉當前的窗口/控件connect(button ,&QPushButton::clicked , this , &Widget::close) ;
}
Widget::~Widget()
{delete ui;
}

自定義槽

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置按鈕//點擊按鈕就修改窗口標題QPushButton * button = new QPushButton (this) ;  //this,掛到對象樹上button->setText("按鈕");button->move(100,100); //移動坐標connect(button , &QPushButton::clicked , this , &Widget::handleClicked) ;}Widget::~Widget()
{delete ui;
}void Widget::handleClicked()
{//點擊按鈕就修改窗口標題setWindowTitle("按鈕已經按下");}

自定義槽函數 ,用ui界面

在Qt 中,除了通過connect來連接信號槽之外,還可以通過函數名字的方式來自動連接

在這里插入圖片描述

在這里插入圖片描述

選擇clicked() ,就會在widget.cpp 生成on_pushButton_clicked 函數的定義

在這里插入圖片描述

在這里插入圖片描述

? 當函數名符合上述規則之后,Qt就能自動的把信號和槽給建立上聯系

自定義信號

Qt 的信號,本質上也就是一個“函數”

Qt 5 以及更高版本中,槽函數和普通的成員函數之間,基本沒有差別

但是信號,則是一類非常特殊的函數。

程序員只要寫出函數聲明,并且告訴 Qt,這是一個“信號”即可。

這個函數的定義,是 Qt 在編譯過程中自動生成的。(自動生成的過程,程序員無法干預)

作為信號函數,這個函數的返回值,必須是void ,有沒有參數都可以, 甚至也可以支持重載

signals : 是 Qt 自己擴展出來的關鍵字

qmake 的時候,調用一些代碼的分析/生成工具,

掃描到類中包含signals 這個關鍵字的時候.此時,就會自動的把下面的函數聲明認為是信號,并且給這些信號函數自動的生成函數定義

widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定義信號   
signals:void  mysignal() ;//自定義槽函數
public slots: //qt5以上 ,public slots可以省略void handleMySignal() ; private:Ui::Widget *ui;
};
#endif // WIDGET_H

如何才能觸發出自定義的信號呢?

Qt 內置的信號,不需要手動通過代碼來觸發

用戶在 GUI,進行某些操作,就會自動觸發對應信號。(發射信號的代碼已經內置到 Qt 框架中了)

例:

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//將自定義信號與槽函數綁定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal()
{setWindowTitle("處理自定義信號");
}void Widget::on_pushButton_clicked()
{//發送信號的操作,也可以在任意合適的代碼中.不一定非得在構造函數里//此時就是點擊按鈕的時候,發送自定義信號了emit mysignal();// 發出自定義的信號//emit可以省略
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定義信號
signals:void  mysignal() ;//自定義槽函數
public slots:void handleMySignal() ;//槽函數
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

信號和槽也可以帶參數
當信號帶有參數的時候,槽的參數必須和信號的參數一致~~
此時發射信號的時候,就可以給信號函數傳遞實參。與之對應的這個參數就會被傳遞到對應的槽函數中。

這里的參數類型必須要一致
個數可以不一致,但是 信號的參數的個數必須要比槽的參數個數要更多。

個數可以不一致,但是 信號的參數的個數必須要比槽的參數個數要更多 ,原因:

一個槽函數,有可能會綁定多個信號,如果我們嚴格要求參數個數一致,就意味著信號綁定到槽的要求就變高了。換而言之,當下這樣的規則,就允許信號和槽之間的綁定更靈活了。更多的信號可以綁定到這個槽函數上了

例如:

參數類型必須要一致 ,個數一致

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//將自定義信號與槽函數綁定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text )
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//發送信號的操作,也可以在任意合適的代碼中.不一定非得在構造函數里//此時就是點擊按鈕的時候,發送自定義信號了emit mysignal("把標題設置為標題1");// 發出自定義的信號
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把標題設置為標題2");// 發出自定義的信號
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定義信號
signals:void  mysignal(const QString &  text) ;//自定義槽函數
public slots:void handleMySignal(const QString & text) ;//槽函數
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

參數類型必須要一致 ,信號的參數的個數必須要比槽的參數個數要更多

例如:

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//將自定義信號與槽函數綁定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text)
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//發送信號的操作,也可以在任意合適的代碼中.不一定非得在構造函數里//此時就是點擊按鈕的時候,發送自定義信號了emit mysignal("把標題設置為標題1","");// 發出自定義的信號
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把標題設置為標題2","");// 發出自定義的信號
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//自定義信號
signals:void  mysignal(const QString &  text,const QString & text2) ;//自定義槽函數
public slots:void handleMySignal(const QString & text) ;//槽函數
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

Q_OBJECT:

Qt硬性規定:Qt中如果要讓某個類能夠使用信號槽(可以在類中定義信號和槽函數)

必須要在類最開始的地方,寫下 Q_OBJECT 宏。

一個信號,可以 connect到多個槽函數上

一個槽函數,也可以被多個信號 connect

例如:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
signals://自定義信號void mySignal1() ;void mySignal2() ;void mySignal3()  ;
public slots://自定義槽函數void mySlot1();void mySlot2();void mySlot3();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信號與槽函數 ,形成多對多的關系connect(this, &Widget::mySignal1, this, &Widget::mySlot1);connect(this, &Widget::mySignal1, this, &Widget::mySlot2);connect(this, &Widget::mySignal2, this, &Widget::mySlot1);connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
}Widget::~Widget()
{delete ui;
}void Widget::mySlot1()
{qDebug() << "mySlots1" ; 
}
void Widget::mySlot2()
{qDebug() << "mySlots2" ; 
}
void Widget::mySlot3()
{qDebug() << "mySlots3" ; 
}

disconnect

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots :void  handClick() ;
public slots :void handClicked2();
private slots:void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//將信號與槽函數關聯connect(ui->pushButton  ,& QPushButton::clicked, this , &Widget::handClick) ;
}Widget::~Widget()
{delete ui;
}void Widget::handClick()
{setWindowTitle("修改窗口的標題");qDebug() <<"handClick";
}void Widget::handClicked2()
{setWindowTitle("修改窗口的標題2");qDebug() <<"handClicked2";
}
void Widget::on_pushButton_2_clicked()
{//1、先斷開pushButton 的信號槽disconnect(ui->pushButton ,&QPushButton::clicked, this, &Widget::handClick );//2、重新綁定信號槽connect(ui->pushButton ,&QPushButton::clicked, this , &Widget::handClicked2) ;
}

定義槽函數使用lambda

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置一個按鈕,并將按鈕移動位置QPushButton * button= new QPushButton(this) ;button->setText("按鈕" ) ;button->move(200,200) ;//關聯信號與槽函數//lambda就是槽函數connect(button ,&QPushButton::clicked , this ,[button,this](){qDebug()<<"lambda被執行了";button->move(500,500) ;this->move(500,500);} );}Widget::~Widget()
{delete ui;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63413.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寫SQL太麻煩?免費搭建 Text2SQL 應用,智能寫 SQL | OceanBase AI 實踐

自OceanBase 4.3.3版本推出以來&#xff0c;向量檢索的能力受到了很多客戶的關注&#xff0c;也紛紛表達希望OB能拓展更多 多模數據庫大模型 的AI應用實踐。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免費構建你的專屬 AI 助手 &#xff0c;我們介紹了如何去搭建一…

400G/800G光模塊崛起:AI時代的網絡基礎設施革命

隨著AI技術的不斷成熟&#xff0c;各行各業都在大規模投入AI。醫療行業通過AI技術實現了更精準的診斷和治療&#xff1b;金融行業通過AI技術提高了風險管理能力&#xff1b;制造行業通過AI技術優化了生產流程&#xff1b;娛樂行業通過AI技術創造了更加豐富的用戶體驗。AI在醫療…

Dalsa線陣CCD相機使用開發手冊

要使用Dalsa工業相機進行二次開發&#xff0c;看用戶開發手冊順便做下筆記&#xff1a;&#xff08;歡迎加QQ討論&#xff1a;77248031&#xff0c; 或QQ群&#xff1a;585068192&#xff09; 由于“本公主”用的.NET開發&#xff0c;軟件支持只翻譯了手冊中.NET部分&#xff0…

C++特殊類設計(單例模式等)

目錄 引言 1.請設計一個類&#xff0c;不能被拷貝 2. 請設計一個類&#xff0c;只能在堆上創建對象 為什么設置實例的方法為靜態成員呢 3. 請設計一個類&#xff0c;只能在棧上創建對象 4. 請設計一個類&#xff0c;不能被繼承 5. 請設計一個類&#xff0c;只能創建一個對…

分布式系統架構:服務容錯

1.為什么需要容錯 分布式系統的本質是不可靠的&#xff0c;一個大的服務集群中&#xff0c;程序可能崩潰、節點可能宕機、網絡可能中斷&#xff0c;這些“意外情況”其實全部都在“意料之中”。故障的發生是必然的&#xff0c;所以需要設計一套健壯的容錯機制來應對這些問題。 …

【Latex手冊】自用

收錄Latex使用文檔/工具 個人使用時候的tips&#xff0c;僅供個人使用 核心網頁&#xff1a;LaTeX 工作室 【1】首頁 | LaTeX 知識庫 &#xff08;有詳細的入門教程&#xff09; 【2】LaTeX工作室 - LaTeX工作室&#xff08;一些模板&#xff09; 【3】LaTeX 工作室 &…

Pytorch應用實戰(1)- 基于YOLO的視頻人臉馬賽克處理

免費鏈接: Blogger(需翻Q), Github 文章目錄 本文介紹給圖片的人臉打碼給視頻的人臉打碼本文介紹 YoloV11(Github)提供了非常方便的API幫助用戶實現目標檢測(detect)、語義分割(segement)、肢體識別(Pose)等功能。 本文將基于YoloV11的目標檢測來實現一個視頻人臉馬…

[IT項目管理]九.項目質量管理

九&#xff0e;項目質量管理 9.1項目質量管理的重要性 對于很多IT項目的差勁&#xff0c;大多數人只可以忍受。項目質量管理是IT項目管理的重要組成部分&#xff0c;對于提高項目成功率、降低項目成本、提升客戶滿意度至關重要。盡管很多人對IT項目的質量問題感到無奈&#x…

【Threejs】從零開始(六)--GUI調試開發3D效果

請先完成前置步驟再進行下面操作&#xff1a;【Threejs】從零開始&#xff08;一&#xff09;--創建threejs應用-CSDN博客 一.GUI界面概述 GUI&#xff08;Graphical User Interface&#xff09;指的是圖形化用戶界面&#xff0c;廣泛用在各種程序的上位機&#xff0c;能夠通過…

ffmpeg-SDL顯示BMP

效果圖如下 本文主要將我們通過創建窗口、渲染上下文工具、紋理工具、矩形框工具&#xff1b;其需要主要的是&#xff1a;首先我們在顯示BMP時&#xff0c;需要先創建好窗口&#xff0c;再使用渲染工具對窗口進行格式刷&#xff0c;使用紋理工具和渲染工具配合進行BMP圖片顯示…

多音軌視頻使用FFmpeg刪除不要音軌方法

近期給孩子找宮崎駿動畫&#xff0c;但是有很多是多音軌視頻但是默認的都是日語&#xff0c;電視上看沒辦法所以只能下載后刪除音軌文件只保留中文。 方法分兩步&#xff0c;先安裝FFmpeg在轉文件即可。 第一步FFmpeg安裝 FFmpeg是一個開源項目&#xff0c;包含了處理視頻的…

基礎二分查找總結題-單峰序列2類做法

&#x1f330;單峰序列題目描述 晴問算法 題目描述&#xff1a; 單峰序列是指&#xff0c;在這個序列中存在一個位置&#xff0c;滿足這個位置的左側&#xff08;含該位置&#xff09;是嚴格遞增的、右側&#xff08;含該位置&#xff09;是嚴格遞減的&#xff0c;這個位置被…

【SH】Ubuntu Server 24搭建Web服務器訪問Python程序研發筆記

文章目錄 說個問題寫個方案一、安裝Ubuntu Server二、安裝Web服務器采用Nginx服務器 三、安裝Python及依賴創建項目虛擬環境 四、安裝Python Web框架采用Flask框架創建和運行Flask應用&#xff08;以后的重點&#xff09; 五、安裝WSGI服務器采用Gunicorn 六、配置Nginx七、驗證…

Vue3 重置ref或者reactive屬性值

需要重新定義一個對象綁定復制給原對象 。 實例代碼: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置對象值 const reset()>{Object.assign(formData, data()…

C#速成(GID+圖形編程)

常用類 類說明Brush填充圖形形狀,畫刷GraphicsGDI繪圖畫面&#xff0c;無法繼承Pen定義繪制的對象直線等&#xff08;顏色&#xff0c;粗細&#xff09;Font定義文本格式&#xff08;字體&#xff0c;字號&#xff09; 常用結構 結構說明Color顏色Point在平面中定義點Rectan…

vue iframe進行父子頁面通信并切換URL

使用通義千問提問后得到一個很好的示例。 需求是2個項目需要使用同一個面包屑進行跳轉&#xff0c;其中一個是iframe所在的項目&#xff0c;另一個需要通過地址訪問。通過 window.parent.postMessage &#xff0c;幫助 <iframe> 內嵌入的子頁面和其父頁面之間進行跨域通…

誰說C比C++快?

看到這個問題&#xff0c;我我得說&#xff1a;這事兒沒有那么簡單。 1. 先把最大的誤區打破 "C永遠比C快" —— 某位1990年代的程序員 這種說法就像"自行車永遠比汽車省油"一樣荒謬。我們來看個例子&#xff1a; // C風格 char* str (char*)malloc(100…

【ADS射頻電路學習筆記】1. ADS基本操作

下面介紹ADS中主要仿真器的使用 1. 直流仿真 直流仿真器在控制面板的simulator-dc 直流仿真器 但是ADS自帶有很多仿真器&#xff0c;可以直接來調用 選用晶體管電流掃描的模板 就可以輸出模板 然后調入晶體管模型 然后要設置掃描的電壓&#xff0c;選擇dc仿真器對vds進行掃描…

CSS學習記錄12

CSS浮動 CSSfloat屬性規定元素如何浮動 CSSclear屬性規定哪些元素可以在清除的元素旁邊以及在哪一側浮動。 float屬性 float屬性用于定位和格式化內容&#xff0c;例如讓圖像向左浮動到容器的文本那里。 float屬性可以設置以下值之一&#xff1a; left - 元素浮動到其容器…

Chinese-Clip實現以文搜圖和以圖搜圖(transformers版)

本文不生產技術&#xff0c;只做技術的搬運工&#xff01; 前言 作者昨天使用cn_clip庫實現了一版&#xff0c;但是覺得大家復現配置環境可能有點復雜&#xff0c;因此有使用transformers庫實現了一版&#xff0c;提供大家選擇&#xff0c;第一篇參考鏈接如下&#xff1a; Ch…