Qt修仙之路2-1 煉丹初成

在這里插入圖片描述
在這里插入圖片描述

widget.cpp

#include "widget.h"
#include<QDebug>
//實現槽函數
void Widget::login1()
{QString user=username_input->text();QString pass=password_input->text();//如果不勾選無法登入if(!check->isChecked()){qDebug()<<"xxx"<<endl;return;}if("123"==user&&"123"==pass){qDebug()<<"登入成功";this->close();}else{//錯誤清空password_input->setText("");}
}Widget::Widget(QWidget *parent): QWidget(parent)
{this->resize(468,657);//創建頭像標簽avatar=new QLabel(this);//移動位置avatar->resize(114,114);avatar->setStyleSheet(" border-radius: 50px;");avatar->move((this->width()-avatar->width())/2,95);//加載圖片avatar->setPixmap(QPixmap("C:\\Users\\xzq\\Desktop\\ava.png"));avatar->setScaledContents(true);//添加輸入框username_input=new QLineEdit(this);//設置大小username_input->resize(371,60);username_input->setStyleSheet(" border-radius: 10px;");//設置占位文本username_input->setPlaceholderText("請輸入QQ賬號");//設置位置username_input->move((this->width()-username_input->width())/2,avatar->y()+avatar->height()+30);//設置文本大小居中username_input->setFont(QFont("黑體",20,5));username_input->setAlignment(Qt::AlignmentFlag::AlignHCenter);password_input=new QLineEdit(this);password_input->resize(371,60);password_input->setStyleSheet(" border-radius: 10px;");password_input->move((this->width()-username_input->width())/2,avatar->y()+avatar->height()+30+80);password_input->setPlaceholderText("請輸入QQ密碼");password_input->setFont(QFont("黑體",10,5));password_input->setAlignment(Qt::AlignmentFlag::AlignHCenter);password_input->setEchoMode(QLineEdit::Password);//復選框check=new QCheckBox("已閱并同意",this);//check->resize(373,26);check->setStyleSheet(        "QCheckBox::indicator {""    width: 16px;""    height: 16px;""    border-radius: 8px;""    border: 1px solid gray;""}""QCheckBox::indicator:checked {""    background-color: blue;""}");check->move((this->width()-check->width())/2,(password_input->y()+password_input->height())+10);//登入按鈕login_btn=new QPushButton("登入",this);login_btn->resize(371,60);login_btn->setStyleSheet(        "QPushButton {""    background-color: #0099FF;"  // 正常狀態背景顏色"    color: white;"  // 文字顏色"    border: none;"  // 無邊框"    padding: 10px 20px;"  // 內邊距"border-radius:10px;""}""QPushButton:pressed {""    background-color: #97D6FF;"  // 按下狀態背景顏色"}");login_btn->setFont(QFont("黑體",20,5));//移動login_btn->move(password_input->x(),check->y()+check->height()+20);//鏈接QObject::connect(login_btn,&QPushButton::clicked,this,&Widget::login1);}Widget::~Widget()
{
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QLabel>
#include<QLineEdit>
#include<QRadioButton>
#include<QPushButton>
#include<QCheckBox>
class Widget : public QWidget
{Q_OBJECT
public slots://登入定義槽函數void login1();
public:Widget(QWidget *parent = nullptr);~Widget();
private:QLabel *avatar;//頭像QLineEdit *username_input;//QQ號QLineEdit *password_input;//密碼QPushButton *login_btn;//登入QCheckBox *check;//協議};
#endif // WIDGET_H

修仙筆記

一、對象樹模型

1.1 對象樹的構建

Qt中,每個QObject或其派生類對象都能有一個父對象和多個子對象。在創建對象時,如果指定了父對象,該對象會自動被添加到父對象的子對象列表中。這種父子關系形成了一種樹形結構,父對象處于樹的頂端,子對象在其下方,并且子對象還可以擁有自己的子對象。例如,在一個圖形界面應用中,窗口可以作為父對象,而按鈕、文本框等控件則是其子對象。

1.2 對象樹的自動管理

這一特性是對象樹模型的一大亮點。當父對象被銷毀時,Qt會自動遞歸地銷毀其所有子對象。這意味著開發者無需手動釋放子對象的內存,大大簡化了內存管理的過程,有效減少了內存泄漏的風險。在實際開發中,這一機制能讓開發者更專注于業務邏輯的實現,而無需過多擔心對象的生命周期管理。

1.3 對象樹的遍歷

在開發過程中,經常需要查找或遍歷對象樹中的子對象。Qt提供了findChildfindChildren方法,通過這兩個方法,可以按名稱或類型查找子對象。另外,使用children方法能夠獲取所有子對象的列表,方便進行遍歷操作。比如,想要獲取窗口中所有的按鈕控件,就可以利用這些方法來實現。

1.4 對象樹的事件傳遞

Qt的事件系統借助對象樹來傳遞事件。事件通常從子對象向父對象傳遞,直到事件被處理或者到達根對象。同時,父對象還可以通過eventFilter方法攔截并處理子對象的事件。這一機制在實現一些全局的事件處理邏輯時非常有用,例如在一個包含多個輸入框的窗口中,統一處理所有輸入框的焦點變化事件。

1.5 對象樹的動態修改

對象樹支持動態修改,既可以通過setParent方法,也可以在構造函數中指定父對象來動態添加子對象。如果想要移除子對象,可以使用setParent(nullptr)將其從樹中移除,但此時需要手動管理該子對象的生命周期。

二、信號與槽機制

2.1 信號

信號是類中的特殊成員函數,用于組件向外界傳遞信息。它定義在類體內的signals權限下,只有聲明,沒有函數體實現,返回值為void類型,參數可有可無。在程序需要的地方,通過emit關鍵字來手動發射信號。例如,一個按鈕被點擊時,就可以發射一個信號來通知其他組件。

2.2 槽

槽是用于接收其他組件發射的信號并執行相應邏輯的特殊成員函數,定義在類體內的slots權限下,是一個完整的函數,既有聲明也有定義。槽函數不僅可以接收信號,還能當作普通成員函數被調用,但普通成員函數不能當作槽函數使用。其返回值類型通常為void,參數用于接收信號函數傳遞過來的數據。槽函數需要與信號函數進行連接,當信號發射時,與之連接的槽函數會自動執行。

2.3 一個包含了信號與槽的類的定義

class Widget : public QWidget
{Q_OBJECT          //信號與槽機制的元對象signals:void my_signal();              //定義一個信號函數public slots:void my_slot();               //自定義的槽函數public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};//自定義槽函數的實現
void Widget::my_slot()
{// 這里編寫槽函數的具體邏輯
}

2.4 信號與槽的連接

  • 基于ui界面的連接:可以直接使用系統默認提供的組件信號與槽函數進行連接。
  • 右鍵轉到槽:在ui界面中,通過右鍵轉到槽的方式,信號函數由系統提供,開發者可以自己實現槽函數的邏輯,此時槽函數會自動生成。
  • 手動實現QT4版本的連接:這種連接方式不太友好,需要使用SIGNAL()SLOT()兩個宏函數來轉換信號函數和槽函數的函數名(因為它們實際是函數指針類型,而參數要求是字符串類型)。
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));
  • QT5版本的連接:相比QT4版本,QT5的連接方式更加簡潔,直接使用信號函數和槽函數的地址進行連接。
QObject::connect(lineEdit, &QLineEdit::textChanged,label,  &QLabel::setText);
  • 使用仿函數作為信號的接收者:接收信號后的處理邏輯可以是全局函數、仿函數或者Lambda表達式。

2.5 信號與槽的斷開連接

如果需要斷開信號與槽的連接,只需將連接函數connect改為disconnect,并根據不同的連接方式提供相應的參數即可。

    void disconnectSlots() {QObject::disconnect(this, &MyWidget::customSignal, this, &MyWidget::customSlot);qDebug() << "信號與槽已斷開";}

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

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

相關文章

【R語言】環境空間

一、環境空間的特點 環境空間是一種特殊類型的變量&#xff0c;它可以像其它變量一樣被分配和操作&#xff0c;還可以以參數的形式傳遞給函數。 R語言中環境空間具有如下3個特點&#xff1a; 1、對象名稱唯一性 此特點指的是在不同的環境空間中可以有同名的變量出現&#x…

【redis】緩存設計規范

本文是 Redis 鍵值設計的 14 個核心規范與最佳實踐&#xff0c;按重要程度分層說明&#xff1a; 一、通用數據類型選擇 這里我們先給出常規的選擇路徑圖。 以下是對每個步驟的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…

2021 年 9 月青少年軟編等考 C 語言五級真題解析

目錄 T1. 問題求解思路分析T2. 抓牛思路分析T3. 交易市場思路分析T4. 泳池思路分析T1. 問題求解 給定一個正整數 N N N,求最小的 M M M 滿足比 N N N 大且 M M M 與 N N N 的二進制表示中有相同數目的 1 1 1。 舉個例子,假如給定 N N N 為 78 78 78,二進制表示為 …

Windows 中學習Docker環境準備2、Docker Desktop中安裝ubuntu

Windows 中學習Docker環境準備1、Win11安裝Docker Desktop Windows 中學習Docker環境準備2、Docker Desktop中安裝ubuntu Windows 中學習Docker環境準備3、在Ubuntu中安裝Docker 需要更多Docker學習視頻和資料&#xff0c;請文末聯系 一、安裝 Docker Desktop 下載 Docker…

LabVIEW2025中文版軟件安裝包、工具包、安裝教程下載

下載鏈接&#xff1a;LabVIEW及工具包大全-三易電子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安裝圖文教程》 1、解壓后&#xff0c;雙擊install.exe安裝 2、選中“我接受上述2條許可協議”&#xff0c;點擊下一步 3、點擊下一步&#xff0c;安裝NI Packa…

PHP ODBC:深入探索數據庫連接與交互技術

PHP ODBC:深入探索數據庫連接與交互技術 引言 PHP作為一種廣泛使用的服務器端腳本語言,在Web開發中扮演著重要角色。在數據處理方面,PHP與數據庫的交互是其核心功能之一。ODBC(Open Database Connectivity)作為一種標準數據庫訪問接口,允許PHP應用程序與各種數據庫系統…

AUTOSAR汽車電子嵌入式編程精講300篇-基于FPGA的CAN FD汽車總線數據交互系統設計

目錄 前言 汽車總線以及發展趨勢 汽車總線技術 汽車總線發展趨勢 CAN FD總線國內外研究現狀 2 系統方案及CAN FD協議分析 2.1系統控制方案設計 2.2 CAN FD總線幀結構分析 2.2.1數據幀分析 2.2.2遠程幀分析 2.2.3過載幀分析 2.2.4錯誤幀分析 2.2.5幀間隔分析 2.3位…

BUU17 [RoarCTF 2019]Easy Calc1

自用 源代碼 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…

5. k8s二進制集群之ETCD集群部署

下載etcd安裝包創建etcd配置文件準備證書文件和etcd存儲目錄ETCD證書文件安裝(分別對應指定節點)創建證書服務的配置文件啟動etcd集群驗證etcd集群狀態繼續上一篇文章《k8s二進制集群之ETCD集群證書生成》下面介紹一下etcd證書生成配置。 下載etcd安裝包 https://github.com…

Java并發編程筆記

Java并發基礎知識補全 啟動 啟動線程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start 2、X implements Runnable&#xff1b;然后交給Thread運行 線程的狀態 Java中線程的狀態分為6種&#xff1a; 1. 初始(NEW)&#xff1a;新創建了一個線程對象&…

使用多模態大語言模型進行深度學習的圖像、文本和語音數據增強

在過去的五年里&#xff0c;研究方向已從傳統的機器學習&#xff08;ML&#xff09;和深度學習&#xff08;DL&#xff09;方法轉向利用大語言模型&#xff08;LLMs&#xff09;&#xff0c;包括多模態方法&#xff0c;用于數據增強&#xff0c;以提高泛化能力&#xff0c;并在…

Windows Docker筆記-Docker拉取鏡像

通過在前面的章節《安裝docker》中&#xff0c;了解并安裝成功了Docker&#xff0c;本章講述如何使用Docker拉取鏡像。 使用Docker&#xff0c;主要是想要創建并運行Docker容器&#xff0c;而容器又要根據Docker鏡像來創建&#xff0c;那么首當其沖&#xff0c;必須要先有一個…

YOLOv11-ultralytics-8.3.67部分代碼閱讀筆記-autobatch.py

autobatch.py ultralytics\utils\autobatch.py 目錄 autobatch.py 1.所需的庫和模塊 2.def check_train_batch_size(model, imgsz640, ampTrue, batch-1, max_num_obj1): 3.def autobatch(model, imgsz640, fraction0.60, batch_sizeDEFAULT_CFG.batch, max_num_obj1): …

【文件上傳、秒傳、分片上傳、斷點續傳、重傳】

文章目錄 獲取文件對象文件上傳&#xff08;秒傳、分片上傳、斷點續傳、重傳&#xff09;優化 獲取文件對象 input標簽的onchange方法接收到的參數就是用戶上傳的所有文件 <html lang"en"><head><title>文件上傳</title><style>#inp…

Office/WPS接入DS等多個AI工具,開啟辦公新模式!

在現代職場中&#xff0c;Office辦公套件已成為工作和學習的必備工具&#xff0c;其功能強大但復雜&#xff0c;熟練掌握需要系統的學習。為了簡化操作&#xff0c;使每個人都能輕松使用各種功能&#xff0c;市場上涌現出各類辦公插件。這些插件不僅提升了用戶體驗&#xff0c;…

FPGA的IP核接口引腳含義-快解

疑問 手冊繁瑣&#xff0c;怎樣快速了解IP核各輸入輸出接口引腳的含義。 答疑 不慌不慌&#xff0c;手冊確實比較詳細但繁瑣&#xff0c;如何快速知曉該部分信息&#xff0c;濤tao道長給你們說&#xff0c;簡單得很&#xff0c;一般新入門的道友有所不知&#xff0c;往往后面…

GnuTLS: 在 pull 函數中出錯。 無法建立 SSL 連接。

提示信息 [root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz --2025-02-06 12:45:34-- https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz 正在解析主機 download.docker.com (download.docker.…

Python3+Request+Pytest+Allure+Jenkins 接口自動化測試[手動寫的和AI寫的對比]

我手動寫的參考 總篇:Python3+Request+Pytest+Allure+Jenkins接口自動化框架設計思路_jenkins python3+request-CSDN博客 https://blog.csdn.net/fen_fen/article/details/144269072 下面是AI寫的:Python3+Request+Pytest+Allure+Jenkins 接口自動化測試[AI文章框架] 在軟…

告別手動操作!用Ansible user模塊高效管理 Linux賬戶

在企業運維環境中&#xff0c;服務器的用戶管理是一項基礎但非常重要的任務。比如&#xff0c;當有新員工加入時&#xff0c;我們需要在多臺服務器上為他們創建賬戶并分配合適的權限。而當員工離職或崗位發生變化時&#xff0c;我們也需要迅速禁用或刪除他們的賬戶&#xff0c;…

ADC模數轉換器概念函數及應用

ADC模數轉換器概念函數及應用 文章目錄 ADC模數轉換器概念函數及應用1.ADC簡介2.逐次逼近型ADC2.1逐次逼近型ADC2.2stm32逐次逼近型2.3ADC基本結構2.4十六個通道 3.規則組的4種轉換模式3.1單次轉換&#xff0c;非掃描模式3.2連續轉換&#xff0c;非掃描模式3.3單次轉換&#xf…