QT5(4)程式碼實現應用及訊號槽例項
阿新 • • 發佈:2019-02-07
一、基於Qt5的程式碼
除了使用Qt的《設計》來快速新增控制元件,同樣可以使用程式碼來新增控制元件。
二、新建專案
在新建專案過程中時取消建立介面,Qt將不會幫我們建立UI程式碼,需要我們手工新增。
三、新增程式碼
1、在mainwindow.h中新增如下程式碼:
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
private:
QLabel *label_1,*label_2;
QLineEdit *lineEdit_1;
QPushButton *button_1 ;
2、在mainwindow.cpp中新增如下控制元件:
QWidget *cenWidget = new QWidget(this); //記得在標頭檔案中包括QWidget
setCentralWidget(cenWidget);
label_1 = new QLabel(cenWidget);
label_1->setText(tr("請輸入:"));
label_2 = new QLabel(cenWidget);
lineEdit_1 = new QLineEdit(cenWidget);
button_1 = new QPushButton(cenWidget);
button_1->setText(tr("顯示面積"));
QGridLayout *mainLayout = new QGridLayout(cenWidget);
mainLayout->addWidget(label_1, 0, 0);
mainLayout->addWidget(lineEdit_1, 0, 1);
mainLayout->addWidget(label_2, 1, 0);
mainLayout->addWidget(button_1, 1 , 1);
connect(button_1, SIGNAL(clicked()), this, SLOT(showArea())); // 此處是對相應控制元件繫結clicked事件
3、在mainwindow中新增如下控制元件:
宣告訊號槽函式:
private slots:
void showArea();
實現訊號槽函式:
void MainWindow::showArea(){
bool ok;
QString tempStr;
QString valueStr = lineEdit_1->text();
int valueInt = valueStr.toInt(&ok);
double area = valueInt*valueInt*3.14;
label_2->setText(tempStr.setNum(area));
}
四、注意問題
1、出現 Attempting to add QLayout “” to MainWindow “”, which already has a layout
解決:佈局layout新建物件時引數使用this,而mainwindow中其實已存在一個layout。不要使用this
2、在mainwindow中新增多個控制元件,控制元件卻重疊只顯示最後一個。
解決:
Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.
新增如下程式碼:
QWidget *cenWidget = new QWidget(this); //新增該行
setCentralWidget(cenWidget); //新增該行
label_1 = new QLabel(cenWidget); //注意引數
label_1->setText(tr("請輸入:"));
label_2 = new QLabel(cenWidget); //注意引數
lineEdit_1 = new QLineEdit(cenWidget); //注意引數
button_1 = new QPushButton(cenWidget); //注意引數
button_1->setText(tr("顯示面積"));
QGridLayout *mainLayout = new QGridLayout(cenWidget); //注意引數
mainLayout->addWidget(label_1, 0, 0);
3、使用訊號槽注意事項:
訊號函式與槽函式引數型別必須按順序對應;槽函式引數個數可少於訊號函式引數個數,且按順序對應,多餘引數會自動忽略。
發出訊號函式:emit iSignal(“訊號發出”);
4、connect引數傳遞解決辦法:
// 1、過載相應類的訊號函式
// 2、自定義訊號函式和槽函式
// 3、直接在類內部定義個成員變數,或者弄個全域性變數