日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Qt Console Application 与 Qt GUI Application互转

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt Console Application 与 Qt GUI Application互转 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在桌面開(kāi)發(fā)中,總的來(lái)說(shuō),包含兩種類(lèi)型的應(yīng)用程序:無(wú)界面的Console程序和有界面的GUI程序。Qt也不例外,包含Qt Console Application和Qt GUI Application。

一、Qt Console Application

在VS2015中創(chuàng)建一個(gè)Qt Console Application,默認(rèn)會(huì)生成一個(gè)main.cpp源文件,代碼如下,

#include <QtCore/QCoreApplication> #include <iostream> //自行添加int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//如果要打印Hello Qt,直接采用C++中的cout對(duì)象即可std::cout << "Hello Qt" << std::endl;return a.exec(); //開(kāi)始主線程事件循環(huán) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析:在main函數(shù)中主要?jiǎng)?chuàng)建了一個(gè)QCoreApplication類(lèi)的對(duì)象,然后執(zhí)行了這個(gè)對(duì)象的exec操作。?
QCoreApplication類(lèi)繼承自QObject,而QObject類(lèi)是Qt中最基本的類(lèi),所有類(lèi)的基類(lèi)。?
QCoreApplication這個(gè)類(lèi)是整個(gè)應(yīng)用程序的核心,用于程序的初始化,生成事件循環(huán),程序退出等一系列動(dòng)作。

二、Qt GUI Application

三種主窗體

Qt有三種類(lèi)型的主窗體:QDialog, QWidget, QMainWindow。

  • QWidget?
    QWidget類(lèi)是所有用戶(hù)界面對(duì)象的基類(lèi),其中QDialog和QMainWindow繼承自它。?
    它有以下的特點(diǎn):

  • Widget是用戶(hù)界面的基本單元:它從窗口系統(tǒng)接收鼠標(biāo),鍵盤(pán)和其他事件,并在屏幕上繪制自己, 最常見(jiàn)的就是控件(按鈕、編輯框等);
  • 每個(gè)Widget都是矩形的,它們按照Z(yǔ)-order進(jìn)行排序;
  • QDialog?
    QDialog類(lèi)是對(duì)話(huà)框窗口的基類(lèi)。一般作為頂級(jí)窗口(沒(méi)有父窗口的窗口稱(chēng)為頂級(jí)窗口)與用戶(hù)交互。?
    常見(jiàn)的對(duì)話(huà)框窗口有:文件選擇窗口、顏色和字體選擇窗口等。

  • QMainWindow?
    提供一個(gè)有中心部件,菜單條、錨接窗口(例如工具條)和一個(gè)狀態(tài)條的主應(yīng)用程序窗口。

錨接部件?
1. 錨接部件一般多為一個(gè)容器來(lái)使用,以包容其他窗口部件來(lái)實(shí)現(xiàn)功能;?
2. 對(duì)于一個(gè)標(biāo)準(zhǔn)的Qt主窗口而言,錨接部件并不是必須的;?
3. 錨接部件可以作為一個(gè)窗口浮動(dòng)在主窗口的上面,也可以像工具欄一樣停靠在主窗口的上、下、左、右4個(gè)方向;?
4. 一個(gè)主窗口可以包含多個(gè)錨接部件。?
中心部件?
1. 主窗口的中心,一個(gè)主窗口只有一個(gè)中心部件。主窗口有自己的布局管理器,因此不能再給主窗口設(shè)置布局,但是可以給中心部件設(shè)置布局。

創(chuàng)建界面的三種方法

  • 手工設(shè)計(jì)界面?
    使用手工創(chuàng)建代碼時(shí),需要從Qt已有的GUI類(lèi)庫(kù)中選擇一個(gè)類(lèi)作為基類(lèi)繼承,并且添加必要的其它成員。通常,我們會(huì)選擇從QDialog、 QWidget、QMainWindow等類(lèi)中選擇一個(gè)作為主窗體;然后創(chuàng)建其它的控件,并使用布局管理器布局這些控件;最后將該布局設(shè)置為主窗體的布 局。如下面例子所示,
#include <QtWidgets/QApplication> #include <QtWidgets/QDialog> #include <QtWidgets/QLabel> #include <QtWidgets/QLineEdit> #include <QtWidgets/QHBoxLayout>class MyDlg : public QDialog { public :MyDlg(QWidget* parent = Q_NULLPTR) :QDialog(parent){/** @breif QT5中如何解決中文亂碼問(wèn)題:* 常量:QString::fromLocal8Bit和QStringLiteral* 對(duì)于字符串變量,使用QString自帶函數(shù)*/plabel = new QLabel(QString::fromLocal8Bit("姓名"));pEdit = new QLineEdit;// 使用布局管理器布局控件QHBoxLayout *Layout = new QHBoxLayout;Layout->addWidget(plabel);Layout->addWidget(pEdit);// 設(shè)置窗口的布局管理器setLayout(Layout);setWindowTitle(tr("Find"));setFixedHeight(sizeHint().height());} private:QLabel* plabel;QLineEdit* pEdit; }; int main(int argc, char *argv[]) {QApplication a(argc, argv);MyDlg mydlg;mydlg.show();return a.exec(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 使用Qt Designer設(shè)計(jì)界面?
    采用Qt Designer,使得快速創(chuàng)建對(duì)話(huà)框成為可能。在Qt Designer環(huán)境中,所有的操作都采用可視化的操作,可拖放控件、關(guān)聯(lián)信號(hào)與槽、設(shè)置特定控件的屬性。如下圖所示,?

  • 動(dòng)態(tài)加載UI文件并生成界面?
     前面的兩種方法需要事先創(chuàng)建好相應(yīng)的文件或代碼,然后連同其它文件進(jìn)行編譯,如果后期要修改界面則必須修改代碼或UI文件并重新編譯。?
     而不需要重新編譯整個(gè)程序的方法是采用動(dòng)態(tài)加載UI文件的方式。UI文件采用Qt Designer編輯,然后在程序中調(diào)用UI文件,如下面代碼所示,

#include "guitest3.h" #include <iostream> #include <QtWidgets/QApplication> #include <QFile> #include <QtUiTools/QtUiTools> #include <QString>#pragma comment(lib, "Qt5UiToolsd.lib") int main(int argc, char *argv[]) {QApplication a(argc, argv);QUiLoader loader;QFile file("./dialog.ui");loader.load(&file)->show();return a.exec(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

QApplication?
QApplication 類(lèi)管理圖形用戶(hù)界面應(yīng)用程序的控制流和主要設(shè)置。 可以說(shuō) QApplication是Qt的整個(gè)后臺(tái)管理的命脈,它包含主事件循環(huán),在其中來(lái)自窗口系統(tǒng)和其它資源的所有事件被處理和調(diào)度。它也處理應(yīng)用程序的初始化和結(jié)束,并且提供對(duì)話(huà)管理。它也處理絕大多數(shù)系統(tǒng)范圍和應(yīng)用程序范圍的設(shè)置。?
對(duì)于任何一個(gè)使用Qt的圖形用戶(hù)界面應(yīng)用程序,都正好存在一個(gè)QApplication對(duì)象,而不論這個(gè)應(yīng)用程序在同一時(shí)間內(nèi)是不是有0、1、2或更多個(gè)窗口。

三、Qt Widgets、QML、Qt Quick的區(qū)別

QT為了進(jìn)一步的實(shí)現(xiàn)界面和邏輯代碼的分離,引入了Qt Quick庫(kù),可以讓用戶(hù)很方便的配置豐富的應(yīng)用界面。與傳統(tǒng)的Qt Widgets相比,


  • Qt Quick用腳本QML及JS,類(lèi)似于DirectUI;而Qt Widgets用C++,即傳統(tǒng)GUI。
  • Qt Quick是一種腳本語(yǔ)言(類(lèi)似于css)。Qt是開(kāi)發(fā)平臺(tái),包含了Qt Quick的運(yùn)行庫(kù)。Qt和Qt Quick的關(guān)系就像 “網(wǎng)頁(yè)”與“樣式表”的關(guān)系。
  • 如果你的界面使用Qt Gui寫(xiě)的,那么用不了qml,因?yàn)閝ml的主要作用就是用來(lái)做畫(huà)面的。把Qt Gui程序當(dāng)成一個(gè)C++程序來(lái)看。如果想顯示qml做的畫(huà)面,在Qt Gui程序中打開(kāi)qml的畫(huà)面,而不要打開(kāi)QWidget那種畫(huà)面即可。
  • QtQuick完成qml腳本到c++的轉(zhuǎn)換(就像網(wǎng)頁(yè)中的javascript不需要編譯,可以直接運(yùn)行一樣)。這樣不需要編譯,就可以直接改腳本來(lái)實(shí)現(xiàn)功能,在嵌入式設(shè)備里用起來(lái)很方便。?
  • 詳細(xì)可以參見(jiàn)“一去丶二三里”的博客:https://blog.csdn.net/liang19890820/article/details/54141552

    版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/hhhuang1991/article/details/79795879

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    GUI轉(zhuǎn)為console mode

    在main.cpp中的修改main,其他的不改

    int main(int argc, char *argv[]) ?//or int main(int argc, char **argv)

    {

    ?? ? //紅色為GUI的code

    ? ? QApplication a(argc , argv);

    ? ? //MainWindow w; //改為console mode時(shí)需要屏蔽

    ? ? //w.show();?//改為console mode時(shí)需要屏蔽

    ? ? //return a.exec();?//改為console mode時(shí)需要屏蔽


    ? ? //灰色為console mode的code

    ????MainWindow RunConsole;

    ? ? return?RunConsole.RunConsoleMode(argc,argv);

    }


    MainWindow 這個(gè)class中定義public?RunConsoleMode(argc,argv)這個(gè)API

    RunConsoleMode(int argc, char **argv)

    {

    ? ? for(int i = 0; i<argc ; i++)

    ? ? {

    ????? ? printf("**argv[%s]" , argv[i] ); //打印出console mode的輸入?yún)?shù)

    ????}

    }

    如cmd輸入:AA.exe -a -b

    則argv[0] = "AA.exe" ;?argv[1] ?= "-a" ; ?argv[2] = "-b"

    總結(jié)

    以上是生活随笔為你收集整理的Qt Console Application 与 Qt GUI Application互转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。