Qt5:Qt入門


  Qt是當今很流行的一種跨平台 GUI 框架,但是發展到如今,他的功能已經不局限於開發GUI應用程序 , 他也可以開發許多的非GUI程序和服務器程序等

  Qt的入門比較簡單,下面以常見的Hello  World程序來開始Qt的學習

 1 #include <QApplication>
 2 #include<QLabel>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7 
 8     QLabel          msg("Hello World");
 9     msg.show();
10 
11     return a.exec();
12 }

<QApplication>是一個應用程序類所在的頭文件  , 每個Qt程序都要包含該頭文件,每次寫程序的時候只要包含他就OK了

然后在main中實例化一個應用程序類的對象

    QApplication  a(argc,argv);

<QLabel>是 QLabel類所定義的都文件

    QLabel 是一個窗口部件 (widget)。窗口部件相當於windows中的控件 和 容器。就是說,窗口部件既可以包含其他的窗口部件,又可以被其他的窗口部件包含。\

  例如菜單,滾動條,狀態欄 和  按鈕等 都是窗口部件(widget),他們都繼承自 QWidget  類。

    絕大多數的應用程序 用 QMainWindow 或 QDialog 最為應用程序的主窗口 , 但是 Qt 和靈活, 任何一個 窗口部件 都可以作為主窗口使用,例如上面的HelloWorld

  程序,就是用QLabel 最為程序的主窗口的。

    上面的QLabel 實例化一個 對象 msg , 並讓其text 屬性為 “Hello World”  : 

        QLabel  msg("Hello World");

  這樣,一個窗口部件就創建出來了。但是,就像windows中的CreateWIndow一樣,窗口只是在內存中創建好了,但是並沒有被顯示出來,要顯示窗口的話,還需要調用

  一個函數:void  show();

        msg.show();

  如果學過windows下的GUI編程的話,就會知道這個函數就相當於 ShowWindow();

    窗口顯示以后,窗口程序就開始要運行了,窗口也就要開始處理各種事件了。這時候派上用場的就是 exec();

        a.exec();

    該函數相當於一個循環,在這個循環里,每次循環都檢查窗口上有沒有什么事件發生,例如 鼠標在窗口上點擊啊,鼠標在窗口上划過啊 ,鍵盤被敲下啊   等等。

    就類似於windows的消息循環,但此處是  事件循環。到此處,一個Hello World 程序就完成了

    另外QLabel  還支持一些簡單的HTML樣式格式,例如

 1 #include <QApplication>
 2 #include<QLabel>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     QLabel          msg("<a href=\"http://www.baidu.com/\">Baidu</a>");//此處的就是讓label上的文字以鏈接的形式現實出來
 8     msg.show();
 9 
10     return a.exec();
11 }

   就像上面的兩個類那樣,Qt中 , 所有的框架提供的類都以字母 Q 開頭, 所有的類對應着一個 以其 類名 命名的 頭文件。如果你想使用某一個類,只要包含

其相應的頭文件即可。

  下面繼續來看Qt中的信號和槽機制。 信號和槽 機制  簡單的來說就是 一個對象身上發生了某個事件 , 其通過某種手段 將發生的時間 通知另一個對象 , 然另一個

 對象用某種手段來處理 發生的事件 。 用  信號 和 槽來命名很形象 ,  A 發生了某件事 , A 就發送一個 信息(就是信號) 給 B , B 有一個專門接受信息的 天線(就是槽)

 B受到A發來的信息后 , 就開始做一些特定的事情 ( 有點遠程控制的味道)。

          信號和槽可以通過QObject::connect(A , signal<something happened > , B , slot<do something> )來關聯

   下面來看 信號-槽 的一個實例

 1 #include <QApplication>
 2 #include<QPushButton>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7 
 8     QPushButton          msg("Hello World");
 9     msg.show();
10 
11     QObject::connect(&msg,SIGNAL(clicked()),&msg,SLOT(close()));
12 
13     return a.exec();
14 }

  上面就是一個簡單的 信號-槽 的使用 , 當PushButton 身上發生一個鼠標點擊的事件時 , 就發送一個信號  clicked()  給他自身 , 他自身收到 clicked()信號后 , 就

  執行一個動作 , 此處的動作就是close()關閉 , 可以發現 該程序 運行時,如果點擊一下 PushButton , 程序就退出了

 

窗口部件的布局:

  窗口部件的布局就是 處理widget 如何格式化擺放的問題的 。 下面先接觸3個類

  • QHBoxLayout 
    • 這個類用於將widget 按橫向排列          
  • QVBoxLayout 
    • 這個類用於將widget按縱向排列                  
  • QGridLayout 
    •  這個類用於將widget按網格狀排列,一般在 將部件分組分別進行橫豎排列后,再進行網格排列

 下面是這三個類的使用實例

        

 1 #include <QApplication>
 2 #include<QPushButton>
 3 #include<QSpinBox>
 4 #include<QSlider>
 5 #include<QHBoxLayout>
 6 #include<QVBoxLayout>
 7 #include<QGridLayout>
 8 
 9 int main(int argc, char *argv[])
10 {
11     QApplication a(argc, argv);
12   //創建各個窗口部件並初始化
13     QWidget*    window = new    QWidget;
14     QPushButton*    btn1 = new QPushButton("b1"),
15             *btn2 = new QPushButton("b2");
16     QSlider*    slider = new QSlider;
17     QSpinBox*    spinbox = new QSpinBox;
18     slider->setRange(0,200);
19     spinbox->setRange(0,200);
20 
21   //創建窗口的布局
22     QHBoxLayout*    hLayout = new QHBoxLayout;
23     QVBoxLayout*    vLayout = new QVBoxLayout;
24     QGridLayout*    gridLayout = new QGridLayout;
25   //btn1 和 slider 排成一排
26     hLayout->addWidget(btn1);
27     hLayout->addWidget(slider);
28   //btn2 和 spinbox 排成一列
29     vLayout->addWidget(btn2);
30     vLayout->addWidget(spinbox);
31   //將兩組widget排列到網格中
32     gridLayout->addLayout(hLayout,0,0,1,2);
33     gridLayout->addLayout(vLayout,3,3,2,1);
34   //把布局應用到主窗口中
35     window->setLayout(gridLayout);
36   //設置  信號-槽 的關聯
37     QObject::connect(slider,SIGNAL(valueChanged(int)),
38              spinbox,SLOT(setValue(int)));
39     QObject::connect(spinbox,SIGNAL(valueChanged(int)),
40              slider,SLOT(setValue(int)));
41     //顯示窗口
42     window->show();
43 
44     return a.exec();
45 }

 

該程序的運行結果如下

  


免責聲明!

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



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