1. 創建Hello Word
????????兩種方式,實現helloworld:
????????1.通過圖形化的方式,在界面上創建出一個控件,顯示helloworld
????????2.通過純代碼的方式,通過編寫代碼,在界面上創建控件, 顯示hello world;
1.1 圖形化的方式
運行結果如下:?
1.2 純代碼的方式
????????label“標簽:界面上一個用來顯示內容的字符串控件。?
widget源文件如下:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLabel* label = new QLabel(this);//創建對象的時候可以在堆上創建,也可以在棧上創建,但是Qt中一般推薦在堆上創建對象//this,是指給當前的label對象,指定一個父對象this,this是指調用該構造函數的對象//即 main函數中的widget w這個對象//此處new的方式創建對象,主要是將這個對象的生命周期交給Qt的對象數來統一管理。//如果在棧上創建該控件對象,可能會存在提前釋放的問題。label->setText("Hello World");//設置控件中,要顯示的文本//QString會隱式顯式
}Widget::~Widget()
{delete ui;
}
1.3 內存泄露問題
????????上述代碼,在Qt中不會產生內存泄露,label對象會合適的時候被析構釋放(雖然沒有手動寫delete,確實能釋放)之所以能夠把對象釋放掉,主要是因為把這個對象是掛到了對象樹上。Qt中搞了一個對象樹,也是N義樹,把界面上的各種元素組織起來了。
? ? ? ? 通過這個樹形結構,就把界面上要現實的這些控件對象都組織起來。組織的目的就是能夠在合適的時候(窗口關閉/銷毀),把這些對象統一進行釋放。
如何查看文件的編碼格式:
.cpp文件,點擊右鍵,一explore方式打開進入資源管理器,將其文件以記事本的方式打開,點擊另存為,查看文本框的編碼格式。如果現實utf-8,說明這個文件就是utf-8編碼;如果顯示的是ansi,說明這個文件就是GBK編碼。
Qt Creater內置的終端不一定是使用utf8的方式現實字符串。
?????????后續再Qt中,如果想通過打印日志的方式輸出一些調試信息,都優先使用qDebug。雖然使用cout也行,但是cout對于編碼的處理不太好,在windows上容易出現亂碼(如果是Linux使用QtCreator,一般就沒事,Linux默認的編碼一般都是utf8)。
????????使用qDebug,還有一個好處就是打印的調試日志,是可以統一進行關閉的。qDebug可以通過編譯開關,來實現一鍵式關閉。
1.4 使用編輯框完成hw
編輯框分為單行編輯框(QLineEdit)和多行編輯框(QTextEdit);
form文件中圖形化操作
純代碼操作:
#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLineEdit* edit = new QLineEdit(this);edit->setText("hello shangjialu");}Widget::~Widget()
{delete ui;
}
?1.5 使用按鈕創建hw
????????push button普通按鈕
????????Qt中的信號槽機制:本質就是給按鈕的點擊操作,關聯上一個處理函數。當用戶點擊的時候,就會執行這個處理函數。
圖形化界面操作?
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//當按鈕被點擊之后,就把按鈕中的文本進行切換if (ui->pushButton->text() == QString("hello shangjialu")){ui->pushButton->setText("hello faka");}else {ui->pushButton->setText("hello shangjialu");}}
純代碼的方式
#include "widget.h"
#include "ui_widget.h"
#include "widget.h"#include <ui_widget.h>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this);myButton->setText("hello shangjialu");connect(myButton,&QPushButton::clicked,this,&Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{if(myButton->text() == "hello shangjialu"){myButton->setText("shang linlu");}else{myButton->setText("hello shangjialu");}
}
?小結:
????????對于純代碼版本,按鈕對象是咱們自己new的。為了保證其他函數中能夠訪問到這個變量,就需要把按鈕對象設定為Widget類的成員變量。
????????對于圖形界面版本版本,此時按鈕對象,不需要咱們自己new。new對象的操作已經是被Qt自動生成了。而且這個按鈕對象,已經作為ui對象里的一個成員變量,也無需作為Widget的成員。
????????實際開發中,是通過代碼的方式構造界面為主,還是通過圖形化界面的方式構造界面為主。這兩種,都很主要,難分主次。
????????如果當前程序界面,界面內容是比較固定的,此時就會以圖形化的方式來構造界面;但是如果程序界面,經常要動態變化,此時就會以代碼的方式來構造界面。?
1.6?QtCreator中的快捷鍵
? 注釋:ctrl+/
? 運行:ctrl+R
? 編譯:ctrl+B
? 字體縮放:ctrl+鼠標滑輪
? 查找:ctrl+F
? 整行移動:ctrl+shift+個/
? 幫助文檔:F1
? 自動對齊:ctrl+i
? 同名之間的.h和.cpp的切換:F4生成函數聲明的對應定義:alt+enter