Qt安裝
Qt基礎部件
.ui文件
在配置好Qt+VS的環境之後,雙擊.ui文件即可以看到ui的編輯頁面。
拖幾個部件進主窗體之後:
運行VS程序就可以看到運行結果出現了編輯之後的效果。
打開你的ui類,我這裏的名字叫做ui_VSHelloWorld.h
,這個類是你編輯.ui文件並且編譯程序之後生成的ui程序。
class Ui_VsHelloWorldClass
{
public:
QPushButton *pushButton;
QLabel *label;
QComboBox *comboBox;
QLineEdit *lineEdit;
QCheckBox *checkBox;
void setupUi(QWidget *VsHelloWorldClass);
void retranslateUi(QWidget *VsHelloWorldClass);
}
類中的五個成員,分別對應Qt Designer
中設計的.ui文件中的五個對象。
修改.ui中對象的屬性
在Qt Designer
中設計ui程序的時候,可以將lineEdit
的默認text爲Hello Qt
。
現在我們想將其設置爲My first Qt
可以在主窗口的構造函數中這樣寫:
ui.setupUi(this);
ui.lineEdit->setText("My first Qt");
窗口與控件
窗口:當一個部件沒有嵌入到其他部件中,則把這個部件叫作窗口或者頂層窗口,頂層窗口是沒有父窗口的,一般的,這些窗口都會被列在任務欄中。一般情況下,一個窗口會包含有標題欄,窗口邊框等。
在main函數中,可以聲明一個新的窗口。
//這是窗口,懸浮在主窗口之上
QLabel L;
L.setWindowTitle("new windows");
L.setText("windows");
L.resize(200, 100);
L.show();
控件:當一個窗口嵌入到其它窗口中,則它本身的標題欄會隱藏,那這些窗口就叫作控件,也可以叫作非頂層窗口或子窗口。
在主窗口的構造函數中,可以聲明一個新的控件
//這是控件,在主ui上面
for(int i = 1; i <= 3; ++i)
{
QPushButton* buttonChild = new QPushButton(this);
buttonChild->setText(QString("im kongjian %1").arg(i));
//子窗口的座標系是以父窗口的座標系爲基準的,並且默認情況下定位在父窗口的(0,0)點處,即窗口繪圖區域的左上角。
//後創建的控件會覆蓋在先創建的控件上。
buttonChild->resize(100 * i, 100*i);
connect(buttonChild, SIGNAL(clicked()), buttonChild, SLOT(close()));
}
窗口的屬性
在主窗口的構造函數中,可以設置窗口的屬性。
//設置窗口的背景顏色
setAutoFillBackground(true);
QPalette pa = this->palette();
pa.setBrush(QPalette::Background, QBrush(Qt::green));
setPalette(pa);
//設置窗口透明度
setWindowOpacity(0.9);
//設置窗口標題
setWindowTitle("windows Attributes");
//設置懸停提示
setToolTip("stop mouse");
//重設大小
resize(600, 400);
//移動,相對於左上角是00
move(100, 100);
命令信號與槽
信號
作用:確定類是否發生改變。
- 聲明信號
signals
- 發送信號
emit
- 所有的信號聲明都是公共的,所以Qt規定不能在signals前面加public,private, protected。
- 所有的信號都沒有返回值,所以返回值都用void。
- 所有的信號都不需要定義,只需要聲明。
- 必須直接或間接繼承自QOBject類,並且開頭私有聲明包含Q_OBJECT。
槽
槽其實就是普通的C++函數,它唯一特點就是能和信號鏈接。當和它鏈接的信號被髮出時,這個槽就會被調用。
- 聲明槽
public/protected/private slots:
命令 connected
鏈接信號與槽。
原型1:
static QMetaObject::Connection connect(
const QObject *sender, //信號發送對象指針
const char *signal, //信號函數字符串,使用SIGNAL()
const QObject *receiver, //槽函數對象指針
const char *member, //槽函數字符串,使用SLOT()
Qt::ConnectionType = Qt::AutoConnection//連接類型,一般默認即可
);
//例如
connect(pushButton, SIGNAL(clicked()), dialog, SLOT(close()));
原型2:
static QMetaObject::Connection connect(
const QObject *sender, //信號發送對象指針
const QMetaMethod &signal,//信號函數地址
const QObject *receiver, //槽函數對象指針
const QMetaMethod &method,//槽函數地址
Qt::ConnectionType type = Qt::AutoConnection//連接類型,一般默認即可
);
//例如
connect(pushButton, QPushButton::clicked, dialog, QDialog::close);
我喜歡將命令讀作:
若 信號sender.signals
發生 則執行 receiver.slots
主窗口中的槽:on_對象名_信號名
在主窗口中聲明槽:
public slots:
void on_pushButton_toggled(bool checked) const;
相當於自動調用了命令:
connect(ui.pushButton, &QPushButton::toggled, this, &SignalsAndSlots2::on_pushButton_toggled);
QWidget、QDialog、QMainWindow的異同點
QWidget
繼承於QObject
和QPaintDevice
。
QDialog
和QMainWindow
則繼承於QWidget
。
QWidget
QWidget
類是所有用戶界面對象的基類。
QDialog
QDialog
類是對話窗口的基類。
對話框窗口是一個頂級窗體,主要用於短期任務以及和用戶進行簡要通訊。
QMainwindow
QMainWindow
類提供一個有菜單條、工具欄、狀態條的主應用程序窗口。
QMainWindow擁有自己的佈局,我們可以使用QMenuBar(菜單欄)、QToolBar(工具欄)、QStatusBar(狀態欄)以及QDockWidget(懸浮窗體),佈局有一個可由任何種類小窗口所佔據的中心區域。