QT最簡單的程序執行過程分析(內含C++基礎知識)


打開QT Creator,新建一個“應用程序-Qt Widgets Application”項目:

輸入名稱scdc之后點擊下一步。

在“構建套件”這個頁面中直接點出下一步,然后再輸入自己的類名DataCenter,其它不用手動改過來,QT會自動修改,如下圖所示:

再點下一步,完成即可了。

這個時候直接點擊左下方的“運行”按鍵,窗體就會出現了。

先看一看項目列表中所列的文件

這些文件分別是:

  1. datacenter.h
  2. datacenter.cpp
  3. main.cpp
  4. datacenter.ui 界面設計文件
  5. ui_datacenter.h 這個文件沒有在左邊的列表中,而是被datacenter.cpp所包含。

 


 main.cpp

#include "datacenter.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); DataCenter w; w.show(); return a.exec(); }

首先來到的是main.cpp這個文件,因為這兒有一個main函數。對於一般的C/C++應用程序來說,main就是程序的起點。所以我們從這里開始分析。

 

QApplication a(argc, argv);

這一句的含義是實例化一個QApplication類,類的名字是a,傳過去的參數則為argc和argv。

我們知道,argc是參數的個數,而argv是各個參數的指針(雙重指針)。

官方的文檔是這樣寫的:

    The QApplication class manages the GUI application's control flow and main settings.

    QApplication contains the main event loop, where all events from the window system and other sources are processed and dispatched. It also handles the application's initialization, finalization, and provides session management. In addition, QApplication handles most of the system-wide and application-wide settings.

    For any GUI application using Qt, there is precisely one QApplication object, no matter whether the application has 0, 1, 2 or more windows at any given time. For non-GUI Qt applications, use QCoreApplication instead, as it does not depend on the QtGui library.

    The QApplication object is accessible through the instance() function that returns a pointer equivalent to the global qApp pointer.

 

DataCenter w;

實例化一個DataCenter類,類的名字是w。DataCenter類是繼承自QMainWindow,我們去了解一下QMainWindow類。

QMainWindow類提供一個有菜單條、錨接窗口(例如工具條)和一個狀態條的主應用程序窗口。

主窗口通常用在提供一個大的中央窗口部件(例如文本編輯或者繪制畫布)以及周圍菜單、工具條和一個狀態條。QMainWindow常常被繼承,因為這使得封裝中央部件、菜單和工具條以及窗口狀態變得更容易。繼承使創建當用戶點擊菜單項或者工具條按鈕時被調用的槽成為可能。你也可以使用Qt設計器來創建主窗口。

 

w.show();

顯示這個窗口部件和它的子窗口部件。

 

return a.exec(); 

程序進入消息循環,等待可能輸入進行響應。這里main()把控制權轉交給Qt,Qt完成事件處理工作,當應用程序退出的時候exec()的值就會返回。在exec()中,Qt接受並處理用戶和系統的事件並且把它們傳遞給適當的窗口部件。

 

因為這是一個QApplication類型的程序,所以一般情況下不需要向控制台窗口打印信息,如果需要的話請使用system命令:

#include "datacenter-import.h"
#include <iostream>

DataCenterImport::DataCenterImport()
{
    system("echo Hello, Merlin");
}

為什么不是cout來打印?

暫時不十分清楚,我想就是因為它是界面應用程序吧,而cout是用於控制台程序的。若使用cout則需要界面退出之后才會將要打印的字符打印到控制台中來。

另外一種方法更值得推薦,使用qDebug:

首先要添加頭文件#include <QDebug>

然后在要輸出調試信息到控制台時加上這一行就行了:

qDebug("Test:::%d", 243);

效果是這樣子的,是不是很合適?

 


 

datacenter.h

#ifndef DATACENTER_H
#define DATACENTER_H

#include <QMainWindow>

namespace Ui {
class DataCenter;
}

class DataCenter : public QMainWindow
{
    Q_OBJECT

public:
    explicit DataCenter(QWidget *parent = 0);
    ~DataCenter();

private:
    Ui::DataCenter *ui;
};

#endif // DATACENTER_H

 

 

datacenter.cpp

#include "datacenter.h"
#include "ui_datacenter.h"

DataCenter::DataCenter(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::DataCenter)
{
    ui->setupUi(this);
}

DataCenter::~DataCenter()
{
    delete ui;
}

與其他函數不同,構造函數除了有名字,參數列表和函數體之外,還可以有初始化列表,初始化列表以冒號開頭,后跟一系列以逗號分隔的初始化字段。上面的QMainWindow(parent)和ui(new Ui::DataCenter)就是初始化列表。

 

 

 

ui_datacenter.h

/********************************************************************************
** Form generated from reading UI file 'datacenter.ui'
**
** Created by: Qt User Interface Compiler version 5.2.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_DATACENTER_H
#define UI_DATACENTER_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_DataCenter
{
public:
    QAction *actionLicense;
    QAction *actionAbout;
    QAction *actionNew;
    QAction *actionOpen;
    QAction *actionSave;
    QAction *actionSave_as;
    QAction *actionTemp_list;
    QAction *actionExit;
    QWidget *centralWidget;
    QPushButton *pushButton;
    QTextBrowser *textBrowser;
    QMenuBar *menuBar;
    QMenu *File;
    QMenu *View;
    QMenu *Tool;
    QMenu *About;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *DataCenter)
    {
        if (DataCenter->objectName().isEmpty())
            DataCenter->setObjectName(QStringLiteral("DataCenter"));
        DataCenter->resize(800, 600);
        QIcon icon;
        icon.addFile(QStringLiteral(":/res/scdc.ico"), QSize(), QIcon::Normal, QIcon::Off);
        DataCenter->setWindowIcon(icon);
        actionLicense = new QAction(DataCenter);
        actionLicense->setObjectName(QStringLiteral("actionLicense"));
        actionLicense->setIcon(icon);
        actionAbout = new QAction(DataCenter);
        actionAbout->setObjectName(QStringLiteral("actionAbout"));
        actionNew = new QAction(DataCenter);
        actionNew->setObjectName(QStringLiteral("actionNew"));
        actionOpen = new QAction(DataCenter);
        actionOpen->setObjectName(QStringLiteral("actionOpen"));
        actionSave = new QAction(DataCenter);
        actionSave->setObjectName(QStringLiteral("actionSave"));
        actionSave_as = new QAction(DataCenter);
        actionSave_as->setObjectName(QStringLiteral("actionSave_as"));
        actionTemp_list = new QAction(DataCenter);
        actionTemp_list->setObjectName(QStringLiteral("actionTemp_list"));
        actionExit = new QAction(DataCenter);
        actionExit->setObjectName(QStringLiteral("actionExit"));
        centralWidget = new QWidget(DataCenter);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QStringLiteral("pushButton"));
        pushButton->setGeometry(QRect(60, 100, 75, 23));
        textBrowser = new QTextBrowser(centralWidget);
        textBrowser->setObjectName(QStringLiteral("textBrowser"));
        textBrowser->setGeometry(QRect(300, 110, 441, 381));
        DataCenter->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(DataCenter);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 800, 23));
        File = new QMenu(menuBar);
        File->setObjectName(QStringLiteral("File"));
        View = new QMenu(menuBar);
        View->setObjectName(QStringLiteral("View"));
        Tool = new QMenu(menuBar);
        Tool->setObjectName(QStringLiteral("Tool"));
        About = new QMenu(menuBar);
        About->setObjectName(QStringLiteral("About"));
        DataCenter->setMenuBar(menuBar);
        mainToolBar = new QToolBar(DataCenter);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        mainToolBar->setMovable(false);
        DataCenter->addToolBar(Qt::TopToolBarArea, mainToolBar);
        DataCenter->insertToolBarBreak(mainToolBar);
        statusBar = new QStatusBar(DataCenter);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        DataCenter->setStatusBar(statusBar);

        menuBar->addAction(File->menuAction());
        menuBar->addAction(View->menuAction());
        menuBar->addAction(Tool->menuAction());
        menuBar->addAction(About->menuAction());
        File->addAction(actionNew);
        File->addAction(actionOpen);
        File->addAction(actionSave);
        File->addAction(actionSave_as);
        File->addSeparator();
        File->addAction(actionTemp_list);
        File->addSeparator();
        File->addAction(actionExit);
        About->addAction(actionLicense);
        About->addAction(actionAbout);

        retranslateUi(DataCenter);

        QMetaObject::connectSlotsByName(DataCenter);
    } // setupUi

    void retranslateUi(QMainWindow *DataCenter)
    {
        DataCenter->setWindowTitle(QApplication::translate("DataCenter", "DataCenter - Copyright 2012-2014 senscom", 0));
        actionLicense->setText(QApplication::translate("DataCenter", "\350\256\270\345\217\257", 0));
        actionAbout->setText(QApplication::translate("DataCenter", "\345\205\263\344\272\216", 0));
        actionNew->setText(QApplication::translate("DataCenter", "New", 0));
        actionOpen->setText(QApplication::translate("DataCenter", "Open", 0));
        actionSave->setText(QApplication::translate("DataCenter", "Save", 0));
        actionSave_as->setText(QApplication::translate("DataCenter", "Save as...", 0));
        actionTemp_list->setText(QApplication::translate("DataCenter", "temp list....", 0));
        actionExit->setText(QApplication::translate("DataCenter", "Exit", 0));
        pushButton->setText(QApplication::translate("DataCenter", "PushButton", 0));
        File->setTitle(QApplication::translate("DataCenter", "\346\226\207\344\273\266", 0));
        View->setTitle(QApplication::translate("DataCenter", "\346\237\245\347\234\213", 0));
        Tool->setTitle(QApplication::translate("DataCenter", "\345\267\245\345\205\267", 0));
        About->setTitle(QApplication::translate("DataCenter", "\345\205\263\344\272\216", 0));
    } // retranslateUi

};

namespace Ui {
    class DataCenter: public Ui_DataCenter {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_DATACENTER_H

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM