zoukankan      html  css  js  c++  java
  • 《QT Creator快速入门》第二章:Hello world

    1、  新建一个Qt GUI应用,并且使Qt自动为我们实现这个GUI应用:菜单栏->新建文件或项目->应用程序->Qt Gui应用->输入项目名称和所在路径->选择默认构建套件->设置主界面类名及其基类(可以从三种基类之一继承:QMainWindow,QWidget,QDialog)->设置项目管理和版本控制->完成。

      这时候我们构建并运行程序就可以看到显示了一个对话框。接着我们通过双击.ui界面文件来进入界面设计模式,从部件列表中拖动一个Label部件到主设计区,并编辑Label显示内容为"hello world! 你好,世界!",还可以在部件的属性栏设置Label的名称、位置、大小等属性。然后再次构建运行程序,可以看到对话框上有了我们添加的Label部件,且Label上显示的是我们刚才设置的文字内容。在这个项目中,Qt自动为我们生成和实现了对话框的头文件和源文件、main函数、.ui文件。

    2、新建一个空的Qt项目,通过我们自己编写全部代码来实现这个GUI应用:在新建项目的时候我们选择其他项目->空的Qt项目,项目创建好后我们为项目添加和实现main函数,代码如下,记得添加头文件<QDebug>来能够调试(qDebug()方法可以向应用程序输出栏输出各种格式,如int、string、QObject(输出对象名)、QObjectList等,如 qDebug() << "get value: " << value;):

    #include <QApplication>
    #include <QDialog>
    #include <QLabel>
    #include <QString>
    #include <QTextCodec>
    #include <QDebug>
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
    
        QDialog dlg;
        dlg.resize(300, 400);
    
        QLabel label(&dlg);
        label.move(100, 100);
    
        /**********Qt Creator中字符串常量默认使用的是utf8编码**********/
    
        //1、使用QTextCodec::setCodecForCStrings设置QString使用的字符编码,此方法在QT5中已废除
        //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
        //QString str = "你好hello";
    
        //2、使用QTextCodec::setCodecForTr设置tr函数使用的字符编码, tr方法实际上是用来实现国际化的,
        //所以这样做实际上是兜了个圈子
        //QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
        //QString str = QObject::tr("hello你好");
    
        //3、使用QString的from...方法来直接设置QString应该使用的字符编码
        QString str = QString::fromUtf8("你hello好");
        QString wstr = QString::fromStdWString(L"你好hello");
    
        //4、QTextCodec可以提供两种编码之间的转换,比如下面是将utf8转换为unicode
        QByteArray encodedString = "hello你好";
        QTextCodec *codec = QTextCodec::codecForName("UTF-8"); //使用utf8编码的codec
        QString ustr = codec->toUnicode(encodedString);
    
        QChar*data = ustr.data();
        int res = memcmp(data, L"hello你好", sizeof(L"hello你好"));
        qDebug() << res; //输出为0
    
        //5、QTextCodec::codecForLocale()可以获得最适合本机环境使用的编码,以下是将unicode转换为utf8
        QByteArray aryByte = codec->fromUnicode(ustr);
        res = memcmp(aryByte.data(), "hello你好", sizeof("hello你好"));
        qDebug() << res; //输出为0
    
        /*********Qt Creator中sizeof字符串得到的大小与VS中不同*********/
        qDebug("%d
    ", sizeof("ab测试")); //输出为9
        qDebug() << sizeof(L"ab测试") << endl; //输出为10
    
        //6、QStringList的使用
        QStringList l;
        l << QString::fromUtf8("item1") << QString::fromUtf8("item2");
        for(int i = 0; i < l.size(); i++)
            qDebug() << l[i] << endl;
    
        label.setText(str);
        dlg.show();
        return app.exec(); //进入事件循环
    }
    View Code

        通过我们自己生成的项目与上面QT自动为我们生成的项目对比,可以看到QT自动生成的项目里与我们自己的项目在整体流程上是相同的,都是在main函数里定义一个Widget窗口,然后调用show来显示这个窗口。但是不同的是QT自动生成的项目里是把对这个窗口的布局、子控件的生成和处理等操作都统一放到了Ui::MainWindow类中,Ui::MainWindow对象作为窗口的成员,在窗口构造函数中调用Ui::MainWindow成员的setupUi方法来对窗口布局进行初始化操作,而当我们在设计模式下对窗口进行设计编译后,Qt Creator会自动对Ui::MainWindow类进行相应的调整。

        我们也可以不使用Qt Creator而直接使用Qt命令行去编译和生成该程序:首先将main.cpp复制到QT的安装目录下的test,在菜单中找到QT下的Command Prompt打开,使用cd命令进入test目录,输入"qmake -project"命令来生成pro工程文件,输入"qmake"命令来生成用于编译的Makefile文件和debug、release目录,输入make命令来编译程序,编译完成后生成了exe文件。Makefile文件中包含了要创建的目标文件或可执行文件、创建目标文件所依赖的文件和需要运行的命令等信息,make就是通过读入Makefile中内容来执行编译工作的。make会为每一个源文件生成对应的.o目标文件,最后将这些目标文件进行链接来生成可执行文件。

     3、我们也可以像第1种方法那样来使用QT自动生成UI布局设计类:新建空的Qt项目->添加新文件->Qt->Qt设计师界面->选择界面模板类型,这里有Dialog with buttons、Main Window、Widget,我们选择Dialog with buttons->输入Qt设计师文件的名称(一般以.ui结尾)和路径->确认->然后就进入到了设计模式,在这里可以对界面进行设计,比如添加一个Label部件并编辑部件显示文本、设置其属性。设计好后ctrl+s保存。这时点击编辑模式,就可以看到.ui文件即Qt设计师文件里的具体内容了->通过构建项目来生成界面实现类,其生成在debug/release目录下,是一个以ui_开头的头文件,具体内容见下方。 每次当我们通过设计模式对.ui文件进行了修改后,再次构建程序即会生成新的界面实现类。->添加main函数,main函数中定义见下方。

    //ui_hellodialog.h
    
    #ifndef UI_HELLODIALOG_H
    #define UI_HELLODIALOG_H
    
    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QDialog>
    #include <QtGui/QHeaderView>
    #include <QtGui/QLabel>
    
    QT_BEGIN_NAMESPACE
    
    class Ui_HelloDialogUi
    {
    public:
        QLabel *label;
    
        void setupUi(QDialog *HelloDialogUi)
        {
            if (HelloDialogUi->objectName().isEmpty())
                HelloDialogUi->setObjectName(QString::fromUtf8("HelloDialogUi"));
            HelloDialogUi->resize(400, 300);
            label = new QLabel(HelloDialogUi);
            label->setObjectName(QString::fromUtf8("label"));
            label->setGeometry(QRect(110, 40, 171, 16));
    
            retranslateUi(HelloDialogUi);
    
            QMetaObject::connectSlotsByName(HelloDialogUi);
        } // setupUi
    
        void retranslateUi(QDialog *HelloDialogUi)
        {
            HelloDialogUi->setWindowTitle(QApplication::translate("HelloDialogUi", "Dialog", 0, QApplication::UnicodeUTF8));
            label->setText(QApplication::translate("HelloDialogUi", "hello world!344275240345245275357274214344270226347225214357274201", 0, QApplication::UnicodeUTF8));
        } // retranslateUi
    
    };
    
    namespace Ui {
        class HelloDialogUi: public Ui_HelloDialogUi {};
    } // namespace Ui
    
    QT_END_NAMESPACE
    
    #endif // UI_HELLODIALOG_H
    View Code
    //main.cpp
    
    #include "ui_hellodialog.h"
    
    int main(int argc, char* argv[])
    {
        QApplication a(argc, argv);
        QDialog w;
        Ui::HelloDialogUi ui;
        ui.setupUi(&w);
        w.show();
        return a.exec();
    }
    View Code

     4、上面第3种方法是在mian方法里直接定义了一个QDialog对象来使用Ui设计类对象来设计QDialog,我们也可以像第1种方法那样使用一个QDialog的派生类对象:

          具体实现为:①、新建空的Qt项目,向项目添加第3种方法中“Qt设计师界面”.ui文件,此时构建项目会在debug/release中生成“Qt设计师界面”生成的界面实现类。

                               ②、向项目添加新文件->C++->C++ Class->输入类名,基类输入QDialog->确认->在生成的新类中调用“Qt设计师界面”生成的界面实现类的设计函数(setupUi()函数)来设计这个QDialog的界面,具体代码见下方。

                               ③、添加main函数,向main函数中添加以下代码。

    //hellodialog.h
    
    #ifndef HELLODIALOG_H
    #define HELLODIALOG_H
    
    #include <QDialog>
    
    namespace Ui
    {
    class HelloDialogUi;
    }
    
    class HelloDialog : public QDialog
    {
        Q_OBJECT
    public:
        explicit HelloDialog(QWidget *parent = 0);
        ~HelloDialog();
    
    signals:
    
    public slots:
    
    private:
        Ui::HelloDialogUi* pUi;
    };
    
    #endif // HELLODIALOG_H
    
    
    
    //hellodialog.cpp
    
    #include "hellodialog.h"
    #include "ui_hellodialog.h"
    
    HelloDialog::HelloDialog(QWidget *parent) :
        QDialog(parent)
    {
        pUi = new Ui::HelloDialogUi;
        pUi->setupUi(this);
    }
    
    HelloDialog::~HelloDialog()
    {
        if(pUi)
           delete pUi;
    }
    View Code
    //main.cpp
    
    #include <QApplication>
    #include "hellodialog.h"
    
    int main(int argc, char* argv[])
    {
        QApplication a(argc, argv);
        HelloDialog w;
        w.show();
    
        return a.exec();
    }
    View Code

    5、上面第4种方法是使用“Qt设计师界面”来生成.ui设计文件对应的实现类,然后再自己生成一个QDialog的派生类, 我们也可以直接一次性生成QDialog的派生类 + ui设计实现类:

           ①、新建空项目->添加新文件->Qt->Qt设计师界面类->界面模板选择Dialog with buttons->输入类名->确认。

            ②、这时我们看到项目生成的QDialog派生类头文件、源文件还有.ui文件,我们可以在设计模式下对ui界面进行设计,然后构建项目就可以在DEBUG目录下看到.ui界面的实现头文件。可以看出,“Qt设计师界面类”自动完成了上面第4种方法中除main函数的实现外的所有功能。

             ③、最后我们添加main函数的实现,如下:

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

     6、生成的exe文件如果需要单独运行的话还需从Qt安装目录拷贝所需的DLL文件,如:libgcc_s_dw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll、QtCored4.dll(release版本为QtCore4.dll)、QtGuid4.dll(release版本为QtGui4.dll)。

     7、设置exe文件的图标:①、将myico.ico图标文件放置工程目录,新建一个名称为myico,后缀名为.rc的文件,在rc文件中输入 IDI_ICON1 ICON DISCARDABLE "myico.ico"。

                                             ②、编辑工程的.pro文件,在其最后加上 RC_FILE += myico.rc。

     8、.pro文件说明

     1 #-------------------------------------------------
     2 #
     3 # Project created by QtCreator 2017-08-11T14:14:01
     4 #
     5 #-------------------------------------------------
     6 
     7 QT       += core gui
     8 
     9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    10 
    11 TARGET = untitled14
    12 TEMPLATE = app
    13 
    14 
    15 SOURCES += main.cpp
    16         widget.cpp
    17 
    18 HEADERS  += widget.h
    19 
    20 FORMS    += widget.ui
    View Code

       第7行中的core为Qt非图形用户界面模块,gui为图形用户界面模块。

       第9行表示如果是Qt5版本,那么就添加QT += widgets。我在Qt 5.5.0版本中新建一个空的Qt项目后,构建提示找不到QApplication头文件错误,然后在.pro文件中加上第9行的内容就可以了。

      第11行是生成的目标文件(exe文件)的名称,可以更改为其他。

       第12行使用app模板,表示这是个应用程序。

      第15、18、20行表示工程包含的源文件、头文件、界面文件。

         为了使Qt Creator支持C++11,需要在 pro文件添加:

           QMAKE_CXXFLAGS += -std=c++11 
       
      CONFIG += c++11

     9、Qt Creator中快捷键

      F1: 显示该方法的帮助文档。
      F2:转到该方法的定义/声明。
      F4: 转到当前文件对应的声明/定义文件。
      Shift + Tab : 减少缩进。
      Ctrl + F: 当前页面搜索。
      Ctrl + Shift + F: 指定更多条件的搜索.
      Ctrl + /:注释/取消注释。
      Alt + 回车 : 添加对应方法声明的实现。
      Ctrl + K : 打开定位器。

  • 相关阅读:
    [LeetCode] Best Time to Buy and Sell Stock III
    [LeetCode] Implement strStr()
    [LeetCode] Wildcard Matching
    [LeetCode] Gray Code
    [LeetCode] Divide Two Integers
    [LeetCode] Flatten Binary Tree to Linked List
    [LeetCode] Binary Tree Maximum Path Sum
    [TopCoder][SRM] SRM 562 DIV 2
    推荐博客文章
    检测两点所确定直线上的像素坐标
  • 原文地址:https://www.cnblogs.com/milanleon/p/7274345.html
Copyright © 2011-2022 走看看