2023-12-05 Qt學習總結2


點擊 <C 語言編程核心突破> 快速C語言入門


Qt學習總結

  • 前言
  • 五 Hello Qt!
  • 六 Qt控件和事件
  • 七 Qt信號和槽
  • 八 Qt自定義信號和槽
  • 總結


前言

要解決問題: 學習qt最核心知識, 多一個都不學.


五 Hello Qt!

現在我們已經有了一個空窗口工程, 傳統上, 我們要實現一個"Hello Qt !"的程序,

雙擊Widget.ui, 進入設計界面
在這里插入圖片描述
鼠標右鍵點擊Label不要松手, 拖入右邊的界面中
在這里插入圖片描述
雙擊TextLabel, 改成Hello Qt !,
在這里插入圖片描述
鼠標右鍵Hello Qt !, 點擊改變格式文本, 更改文字的字號,大小.
在這里插入圖片描述
更改字體: 點擊Hello Qt !在屬性中點擊font字體, 調整字體.
在這里插入圖片描述
運行程序:

在這里插入圖片描述
效果:
在這里插入圖片描述
恭喜你, 寫了第一個Qt程序.

六 Qt控件和事件

Qt的控件可以分為基本控件和高級控件兩種類型,其中基本控件包括按鈕、標簽、文本框、進度條等常用控件,

高級控件包括表格、樹形控件、列表、對話框等更加復雜的控件。

在這里插入圖片描述

通過這些控件的組合和設置屬性,我們可以實現我們所需的用戶界面。

Qt的事件機制允許我們在用戶交互時捕捉到相應的事件,如按鈕被單擊、鼠標移動、鍵盤按下等。

在這里插入圖片描述

我們可以通過重載控件的事件處理函數來處理這些事件,例如QPushButton的clicked()信號就是當用戶單擊該按鈕時觸發的事件。

在這里插入圖片描述

Qt的控件和事件機制為我們設計和實現用戶界面提供了強大的支持,使得我們可以輕松地實現復雜的圖形化交互應用程序。

七 Qt信號和槽

Qt信號和槽是一種重要的機制,用于在對象之間進行通信。

它們是Qt框架中最強大的特性之一。

信號是一種事件,當發生某些特定的情況時,對象發射信號。

例如,當用戶單擊按鈕或窗口關閉時,對象會發射相應的信號。

槽是一種方法,當一個信號發射時,與之相關聯的槽將被調用。

槽可以執行任何操作,例如更改部件屬性、計算數據等等。

一個對象可以有多個信號和槽,它們可以相互連接。

通過使用信號和槽,Qt提供了一種非常方便的方法來實現事件處理和通信。

它可以減少代碼的重復性,使程序更加模塊化和易于維護。

使用信號和槽需要遵循以下步驟:

  1. 定義信號:在類中聲明信號,以便對象可以發射它。

  2. 定義槽:在類中聲明槽,以便當信號被發射時可以調用它.

在這里插入圖片描述
3. 連接信號和槽:使用QObject::connect()函數連接信號和槽。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 鏈接信號與槽 誰發出信號 發出什么信號 誰處理信號 怎么處理connect(ui->CancelButton, &QPushButton::clicked, this,&Widget::on_CancelButton_clicked);
}

以下是一個簡單的示例代碼:

Widget.h, 除了pushButton_clicked()函數, 其余的基本自動給出

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

main.cpp, 全部自動給出

#include "Widget.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "Learn_10_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}Widget w;w.show();return a.exec();
}

Widget.cpp , 除了自己實現pushButton_clicked(), 以及連接clicked信號與pushButton_clicked槽函數, 其余自動給出

#include "Widget.h"
#include "./ui_Widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// button發出clicked信號, widget接收到信號, 運行pushButton_clickedconnect(ui->pushButton, &QAbstractButton::clicked, this,&Widget::pushButton_clicked);
}Widget::~Widget()
{delete ui;
}void Widget::pushButton_clicked()
{QMessageBox::information(this, "信息", "按鈕被點擊");
}

Learn_10_zh_CN.ts, 全部自動給出

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN"></TS>

ui_Widget.h, 拖控件, 改字體, 其余全部自動給出.

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QWidget *widget;QVBoxLayout *verticalLayout;QLabel *label;QPushButton *pushButton;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(271, 126);widget = new QWidget(Widget);widget->setObjectName("widget");widget->setGeometry(QRect(20, 10, 227, 107));verticalLayout = new QVBoxLayout(widget);verticalLayout->setObjectName("verticalLayout");verticalLayout->setContentsMargins(0, 0, 0, 0);label = new QLabel(widget);label->setObjectName("label");QFont font;font.setFamilies({QString::fromUtf8("\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B")});font.setBold(true);label->setFont(font);verticalLayout->addWidget(label);pushButton = new QPushButton(widget);pushButton->setObjectName("pushButton");QFont font1;font1.setFamilies({QString::fromUtf8("\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B")});font1.setPointSize(14);font1.setBold(true);pushButton->setFont(font1);verticalLayout->addWidget(pushButton);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));label->setText(QCoreApplication::translate("Widget", "<html><head/><body><p><span style=\" font-size:36pt; font-weight:700;\">Hello QT !</span></p></body></html>", nullptr));pushButton->setText(QCoreApplication::translate("Widget", "PushButton", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

以上代碼基本都是Qtcreator的框架自動給出的, 真正需要我們編寫的只是UI部分(拖動控件改個名字)和信號與槽連接的部分, 及槽函數, 看著很多, 其實如果熟悉流程, 不會超過五分鐘.

運行效果:
在這里插入圖片描述
在這里插入圖片描述

總之,信號和槽是Qt的核心特性之一,使得對象之間的通信變得非常簡單。在編寫Qt應用程序時,通常需要使用信號和槽機制來實現事件處理和數據通信。

八 Qt自定義信號和槽

Qt提供了一些常見的信號和槽, 如按鈕的clicked()信號和QTimertimeout()信號,但有時你需要定義自己的信號和槽。

以下是定義自定義信號和槽的步驟:

  1. 定義信號:在類中聲明一個信號,可以理解為一個函數聲明,但沒有實現。

注意,使用自定義信號和槽時,必須在類定義中包含Q_OBJECT宏,并且該類必須是QObject的子類。

#ifndef MYCLASS_H
#define MYCLASS_H#include <QDebug>
#include <QObject>class MyClass : public QObject
{Q_OBJECTpublic:explicit MyClass(QObject *parent = nullptr);void myMethod();signals:void mySignal(int);public slots:void mySlot();
};#endif // MYCLASS_H
  1. 激發信號:在類的某個方法中使用emit關鍵字來激發該信號。
void MyClass::myMethod()
{int value = 1000;emit mySignal(value);
}
  1. 定義槽:在類中聲明一個槽,可以理解為一個函數,必須在類外有定義, 且為public, 否則無法調用。
void MyClass::mySlot()
{qDebug() << "mySlot:";
}
  1. 連接信號和槽:在應用程序的合適位置使用connect()方法來連接信號和槽。

連接一個信號和槽,使得當信號激發時,槽函數將被自動調用。

這種connet()的方法是將信號放在SIGNAL這個宏中, 宏將函數擴展為字符串"mySignal(int)", 注意, 對于含有參數的信號, 其格式要求是函數名(形參類型), mySignal(int)

對于槽函數則放在SLOT宏中, 也會將函數擴展為字符串, 函數格式要求與信號一致.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myc = new MyClass;myt = new QTimer;// 誰, 發出信號, 誰, 接收信號做什么connect(myc, SIGNAL(mySignal(int)), myt, SLOT(start(int)));connect(myt, SIGNAL(timeout()), myc, SLOT(mySlot()));
}
  1. 設計一個按鈕pushbutton, 按下調用myMethod()函數, 設計一個stop按鈕, 按下調用Qtimer的stop()函數.

void Widget::on_pushButton_clicked()
{this->myc->myMethod();
}void Widget::on_stopButton_clicked()
{this->myt->stop();
}

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

在上面的例子中,當按下pushbutton時, mySignal信號被激發,接著QTimerstart()方法將被調用,而在QTimer超時時,mySlot方法將被調用, 輸出 "mySlot"

當按下stop按鈕時, 計時器中斷, 不再調用mySlot().

使用自定義信號和槽可以使Qt應用程序更加靈活和可擴展,因為你可以定義和連接任何你需要的信號和槽,以實現特定的功能和交互。


總結

五 Hello Qt!
六 Qt控件和事件
七 Qt信號和槽
八 Qt自定義信號和槽


點擊 <C 語言編程核心突破> 快速C語言入門


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

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

相關文章

(三潮來襲)探尋2023年科技變革潮流與2024年前瞻展望

2023年對于IT行業來說是一個動蕩而又充滿變革的一年。隨著世界逐漸走出前幾年的挑戰&#xff0c;企業逐漸復蘇&#xff0c;但這個行業仍然在經歷著激烈的變革。在這個時候&#xff0c;我們看到了一些引人注目的技術變化和未來的趨勢。 一、2023年回顧 關鍵詞&#xff1a;Chat…

構建Servlet項目流程

第一步&#xff1a;創建maven項目 部分基礎 依賴的模板基礎部分如下 maven-archetype-quickstart: 這是最基本的Archetype&#xff0c;它創建一個包含簡單Java類和單元測試的項目。 maven-archetype-webapp: 這個Archetype創建一個簡單的Java web應用&#xff0c;包括一個serv…

【C++】算法庫(批量操作、搜索操作)

C算法庫 文章目錄 C算法庫批量操作for_eachfor_each_n 搜索操作all_of ,any_of ,none_offind, find_if, find_if_notfind_endstd::find_first_ofadjacent_findcount, count_ifequalsearchsearch_n 算法庫提供大量用途的函數&#xff08;例如查找、排序、計數、操作&#xff09;…

微信小程序 - PC端選擇ZIP文件

微信小程序 - PC端選擇文件 分享代碼片段場景分析解決思路附魔腳本chooseMediaZip 選擇附魔后的ZIP文件相關方法測試方法 參考資料 分享代碼片段 不想聽廢話的&#xff0c;直接看代碼。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 場景分析 如果你的微信小程序需要選…

TypeScript入門實戰筆記 -- 開篇 為什么要選擇 TypeScript ?

typescript 在線編輯器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler學習05-kernel升級

周末沒事&#xff0c;嘗試下openEuler的kernel升級 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…

營收增速持續放緩,博通CEO期待AI崛起救場 | 百能云芯

博通作為蘋果等大型科技公司的芯片供應商&#xff0c;于周四發布了財報。盡管截至10月29日的第四季度營收增長了4%至93億美元&#xff0c;符合市場預期&#xff0c;但增速已經降至2020年以來的最低水平。 由于企業客戶和電信供應商在控制支出方面的謹慎態度&#xff0c;博通的銷…

IDEA構建springBoot新項目時JDK只有17和21,無法選擇JDK8解決方案

今天創建springboot新項目時&#xff0c;發現IDEA里JDK選項只有17和21&#xff0c;無法選擇本機的JDK8&#xff0c;網上查資料后發現是springboot2.7于11.24號后停止維護&#xff0c;基于2.7和java8的spring Initializ官方不再維護&#xff0c;解決方案是在server URL欄&#x…

東北大學Python

目前金屬礦開采&#xff0c;爆破還是主要的破巖方式&#xff0c;為了保證巷道采場的安全&#xff0c;需要對爆破震動進行監測&#xff0c;獲取的監測數據如附件&#xff0c;第1列數據為震動的序號&#xff0c;第2、3、4列為x,y,z三個方向的震動速度&#xff0c;往往由于各種因素…

C++ 運算符重載與操作符重載

目錄 運算符重載 運算符重載的特性 其他運算符重載的實現 默認成員函數——賦值運算符重載 默認成員函數——取地址操作符重載 const成員 附錄 運算符重載 C為了增強代碼的可讀性引入了運算符重載&#xff0c;運算符重載是具有特殊函數名的函數&#xff0c;也具有其返回…

使用Vue實現一個當鼠標懸浮時出現,鼠標離開時消失的雙層菜單

前言 分享一個基于Vue實現一個當鼠標懸浮時出現&#xff0c;鼠標離開時消失的雙層菜單。同時也是為了以后需要類似的需求時&#xff0c;可以提供一個實現思路&#xff0c;以及可以快速ctrlc和ctrlv操作&#xff0c;提高工作效率~ 一、示例代碼 &#xff08;1&#xff09;/sr…

Linux C/C++ 分析網絡流量(十六進制TCP數據包分析)

在分析TCP數據包時&#xff0c;理解TCP協議的工作原理和報文格式是關鍵。TCP是一種面向連接的、提供可靠的、端到端的字節流傳輸服務。其頭部結構包括源端口、目標端口、序列號、確認應答號等字段。序列號是在建立連接時由計算機生成的隨機數作為初始值&#xff0c;每發送一次數…

使用Pytorch從零開始實現BERT

生成式建模知識回顧: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 變分自編碼器 [4] 生成對抗網絡&#xff0c;高級生成對抗網絡 I&#xff0c;高級生成對抗網絡 II [5] 自回歸模型 [6] 歸一化流模型 [7] 基于能量的模型 [8] 擴散模型 I, 擴散模型 II…

前端食堂技術周刊第 107 期:技術播客節、Deno Cron、FEDAY、XState v5、Electron 2023 生態系統回顧

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;烤椰拿鐵 食堂技術周刊倉庫地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童歐巴。歡迎來到前端食堂技術周刊&#xff0c;我們先來看下…

圖論與網絡優化3

CSDN 有字數限制&#xff0c;因此筆記分別發布&#xff0c;目前&#xff1a; 【筆記1】概念與計算、樹及其算法【筆記2】容量網絡模型、遍歷性及其算法【筆記3】獨立集及其算法 6 獨立集及其算法 6.1 獨立集和覆蓋 6.1.1 獨立數和覆蓋數 獨立集&#xff1a;設 S ? V ( G …

PaddleDetection系列2--NCCL安裝及測試

NCCL安裝及測試 1 系統信息查看1.1 查看本機的操作系統和位數信息&#xff1a;1.2 確認處理器架構1.3 確認cuda版本 2 NCCL安裝2.1 根據上面的系統架構以及CUDA版本&#xff0c;進入[官網](https://developer.nvidia.com/nccl/nccl-download)下載匹配的nccl&#xff0c;若想獲取…

力扣44題通配符匹配題解

44. 通配符匹配 - 力扣&#xff08;LeetCode&#xff09; 給你一個輸入字符串 (s) 和一個字符模式 (p) &#xff0c;請你實現一個支持 ? 和 * 匹配規則的通配符匹配&#xff1a; ? 可以匹配任何單個字符。* 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 …

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:梯度Gradient

目錄 1、itkGradientImageFilter2、itkGradientMagnitudeImageFilter 梯度強度3、itkGradientMagnitudeRecursiveGaussianImageFilter 帶濾波的梯度強度4、itkDerivativeImageFilter 不帶濾波的導函數 1、itkGradientImageFilter 該類是一個基類&#xff0c;用于使用方向導數計…

C++筆試題之回文數的判斷

“回文”是指正讀反讀都能讀通的句子&#xff0c;它是古今中外都有的一種修辭方式和文字游戲&#xff0c;如“我為人人&#xff0c;人人為我”等。在數學中也有這樣一類數字有這樣的特征&#xff0c;成為回文數&#xff08;palindrome number&#xff09;。 設n是一任意自然數…