天天看點

Qt視窗之QMainWindow、QDialog、QWidget

  • 在 Qt 中,我們将視窗和控件統稱為部件(Widget)。
  • 視窗是指程式的整體界面,可以包含标題欄、菜單欄、工具欄、關閉按鈕、最小化按鈕、最大化按鈕等。
  • 控件是指按鈕、複選框、文本框、表格、進度條等這些組成程式的基本元素。一個程式可以有多個視窗,一個視窗也可以有多個控件。
  • QWidget 是所有使用者界面元素的基類,視窗和控件都是直接或間接繼承自 QWidget,QMainWindow、QWidget、QDialog 三個類就是用來建立視窗的,可以直接使用也可以繼承後再使用。
  • QMainWindow 視窗可以包含菜單欄、工具欄、狀态欄、标題欄等,是最常見的視窗形式,可以作為GUI程式的主視窗。

如下圖所示:

Qt視窗之QMainWindow、QDialog、QWidget
  • QDialog 是對話框視窗的基類。對話框主要用來執行短期任務,或與使用者進行互動,它可以是模态的也可以是非模态的。QDialog 沒有菜單欄、工具欄、狀态欄等。

如下圖所示:

Qt視窗之QMainWindow、QDialog、QWidget

如果是主視窗,就使用 QMainWindow;如果是對話框,就是用 QDialog;如果不确定,或有可能作為頂級視窗,也有可能嵌入到其他視窗中,那麼使用 QWidget。

需要注意的是,視窗和控件都繼承自 QWidget,如果不為控件指定父對象,它就會被作為視窗處理,這時 setWindowTitle() 和 setWindowIcon() 函數就會生效。

請看下面的代碼:

#include <QApplication>
#include <QLabel>
#include <QPushButton>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("這是Label控件");  //沒有父對象
    label.setWindowTitle("Label控件作為頂級視窗");
    label.setGeometry(100, 50, 360, 160);
    label.setAlignment(Qt::AlignCenter);
    label.show();
    QPushButton btn;  //沒有父對象
    btn.setWindowTitle("PushButton控件作為頂級視窗");
    btn.setText("這是個大大的按鈕");
    btn.setGeometry(480, 50, 360, 160);
    btn.show();
    return app.exec();
}
           
Qt視窗之QMainWindow、QDialog、QWidget

運作代碼,會在距離顯示器 x=100, y=50 的位置彈出兩個視窗,

如下圖所示:

Qt視窗之QMainWindow、QDialog、QWidget

可以發現,視窗和控件沒有絕對的差別,控件也可以成為視窗,這取決于它有沒有父對象。