點擊 <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提供了一種非常方便的方法來實現事件處理和通信。
它可以減少代碼的重復性,使程序更加模塊化和易于維護。
使用信號和槽需要遵循以下步驟:
-
定義信號:在類中聲明信號,以便對象可以發射它。
-
定義槽:在類中聲明槽,以便當信號被發射時可以調用它.
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()
信號和QTimer
的timeout()
信號,但有時你需要定義自己的信號和槽。
以下是定義自定義信號和槽的步驟:
- 定義信號:在類中聲明一個信號,可以理解為一個函數聲明,但沒有實現。
注意,使用自定義信號和槽時,必須在類定義中包含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
- 激發信號:在類的某個方法中使用
emit
關鍵字來激發該信號。
void MyClass::myMethod()
{int value = 1000;emit mySignal(value);
}
- 定義槽:在類中聲明一個槽,可以理解為一個函數,必須在類外有定義, 且為public, 否則無法調用。
void MyClass::mySlot()
{qDebug() << "mySlot:";
}
- 連接信號和槽:在應用程序的合適位置使用
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()));
}
- 設計一個按鈕
pushbutton
, 按下調用myMethod()
函數, 設計一個stop
按鈕, 按下調用Qtimer的stop()
函數.
void Widget::on_pushButton_clicked()
{this->myc->myMethod();
}void Widget::on_stopButton_clicked()
{this->myt->stop();
}
在上面的例子中,當按下pushbutton
時, mySignal
信號被激發,接著QTimer
的start()
方法將被調用,而在QTimer
超時時,mySlot
方法將被調用, 輸出 "mySlot"
。
當按下stop
按鈕時, 計時器中斷, 不再調用mySlot()
.
使用自定義信號和槽可以使Qt應用程序更加靈活和可擴展,因為你可以定義和連接任何你需要的信號和槽,以實現特定的功能和交互。
總結
五 Hello Qt!
六 Qt控件和事件
七 Qt信號和槽
八 Qt自定義信號和槽
點擊 <C 語言編程核心突破> 快速C語言入門