1. 程式人生 > >QT5(4)程式碼實現應用及訊號槽例項

QT5(4)程式碼實現應用及訊號槽例項

一、基於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、直接在類內部定義個成員變數,或者弄個全域性變數