程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【Qt】2.1 創建對話框,qt2.1創建

【Qt】2.1 創建對話框,qt2.1創建

編輯:C++入門知識

【Qt】2.1 創建對話框,qt2.1創建


QDialog是Qt對話框類,可以直接使用這個類來創建對象並顯示出來。

要使用一個對話框,就這樣子寫:

 

 1 #include <QApplication>
 2 #include <QDialog>
 3 #include <QHBoxLayout>
 4 #include <QLineEdit>
 5 #include <QPushButton>
 6 
 7 int mainc(int argc, char *argv[])
 8 {
 9     QApplication app(argc, argv);
10     
11     // 創建一個對話框對象
12     QDialog * dlg = new QDialog;
13     // 設置對話框標題文字
14     dlg->setWindowTitle("對話框");
15     
16     // 創建一個編輯框和按鈕
17     QLineEdit * edit = new QLineEdit;
18     QPushButton * button = new QPushButton("確定");
19     
20     // 創建一個水平布局管理器並將編輯框和按鈕添加進去
21     QHBoxLayout * layout = new QHBoxLayout;
22     layout->addWidget(edit);
23     layout->addWidget(button);
24     
25     // 設置對話框的布局管理器
26     dlg->setLayout(layout);
27     
28     // 顯示對話框
29     dlg->show();
30     
31     return app.exec();
32 }

 

第11行: 創建一個對話框對象

用到的函數:QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlagsf = 0 )

函數的說明:構造一個對話框。

第26行:設置對話框的布局管理器

用到的函數:void QWidget::setLayout ( QLayout * layout )

函數的說明:為指定的部件設置一個布局管理器。如果這個部件已經通過setLayout設置了一個布局管理器,則不能再重復設置。只有先刪除已有的布局管理器才能再次設置新的布局管理器。

 

顯示效果

你會發現,中文顯示成亂碼了。

我百度了一下,然後這個文章說明了為何顯示為亂碼:http://blog.csdn.net/brave_heart_lxl/article/details/7186631

所以按照文章所說的,我只需要添加上這一句話即可。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

寫在setWindowTitle之前的位置就行了。另外可能編譯時會出現QTextCodec找不到的問題,只需要加上頭文件<QTextCodec>即可。

這就是創建的一個普通的對話框。

同時我們可以通過繼承QDialog自己寫一個對話框,實現自己的需要的功能。

就不把書上的代碼搬上來了,我另外自己寫一個。

點擊提交之後,

如果點擊放棄,

當然了這裡沒加入退出程序的代碼~

新建一個類NewDialog,頭文件代碼:

 1 #ifndef NEWDIALOG_H
 2 #define NEWDIALOG_H
 3 
 4 #include <QDialog>
 5 
 6 class QLineEdit;
 7 class QPushButton;
 8 class QLabel;
 9 class QCheckBox;
10 
11 class NewDialog : public QDialog
12 {
13     Q_OBJECT
14     
15 public:
16     NewDialog(QWidget * parent = 0);
17     
18 signals:
19     void infoSubmit(const QString & info);
20     
21 public slots:
22     void setOkButtonEnable();
23     void submitInfo();
24     void cancelDlg();
25     
26 private:
27     QLineEdit * edit;
28     QPushButton * okButton;
29     QPushButton * cancelButton;
30     QLabel * label_Name;
31     QLabel * label_Hobby;
32     QCheckBox * checkBox1;
33     QCheckBox * checkBox2;
34     QCheckBox * checkBox3;
35     QCheckBox * checkBox4;
36     
37 };
38 
39 #endif // NEWDIALOG_H

 

第6~9行:類的前置聲明

第11行:繼承QDialog

第13行:繼承Qt中的類時,開始位置都需要定義Q_OBJECT,這是Qt的宏,必須加就是了。

第16行:提供一個父對象,默認值為0

第18~19行:自定義信號

類中使用Qt的關鍵字signals來自定義信號。

比如這裡的infoSubmit,用來表明點擊了提交按鈕。這裡面自定義的函數是不用自己寫代碼的,它只是一個信號。

可以自己手動發射這個信號,如果信號中帶有參數,必須傳入相應參數即可。

第21~24行:自定義槽

類中使用Qt的關鍵字public/private/protect slots來自定義公有/私有/保護的槽。

需要自已實現槽的代碼。槽可以是公有、私有、保護的,它就像普通的函數,可以被直接調用,也可以當作槽來使用。

槽的參數來自信號的參數,所以,如果槽有若干個參數,如果它和一個信號有連接,那麼那個信號也必須有與之對應的若干參數,類型和參數位置必須一致,否則編譯出錯。

如果信號有參數,槽沒有參數,那麼信號的參數就會被無視掉,這是可以的。

第27~35行:定義使用到的部件

因為定義時只用到了它們的指針,而沒有具體的實例化它們。所以不需要加入頭文件。只需要提供類似class QPushButton;這樣的前置聲明即可。

 

源文件代碼:

  1 #include "newdialog.h"
  2 
  3 #include <QtGui>
  4 
  5 NewDialog::NewDialog(QWidget * parent) : QDialog(parent)
  6 {
  7     // 設置編碼格式
  8     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  9     
 10     // 設置對話框標題
 11     setWindowTitle("個人信息");
 12     
 13     // 新建對象
 14     edit = new QLineEdit;
 15     
 16     okButton = new QPushButton("提交(&o)");
 17     okButton->setEnabled(false);
 18     cancelButton = new QPushButton("放棄(&c)");
 19     
 20     label_Name = new QLabel("你的名字(&i)");
 21     label_Name->setBuddy(edit);
 22     label_Hobby = new QLabel("你的愛好");
 23     
 24     checkBox1 = new QCheckBox("運動");
 25     checkBox2 = new QCheckBox("電影");
 26     checkBox3 = new QCheckBox("看書");
 27     checkBox4 = new QCheckBox("游戲");
 28     
 29     // 設置連接
 30     connect(edit, SIGNAL(textChanged(QString)),
 31             this, SLOT(setOkButtonEnable()));
 32     connect(checkBox1, SIGNAL(clicked(bool)),
 33             this, SLOT(setOkButtonEnable()));
 34     connect(checkBox2, SIGNAL(clicked(bool)),
 35             this, SLOT(setOkButtonEnable()));
 36     connect(checkBox3, SIGNAL(clicked(bool)),
 37             this, SLOT(setOkButtonEnable()));
 38     connect(checkBox4, SIGNAL(clicked(bool)),
 39             this, SLOT(setOkButtonEnable()));
 40     connect(okButton, SIGNAL(clicked(bool)),
 41             this, SLOT(submitInfo()));
 42     connect(cancelButton, SIGNAL(clicked(bool)),
 43             this, SLOT(cancelDlg()));
 44     
 45     
 46     // 設置布局
 47     
 48     // 名字
 49     QHBoxLayout * layoutName = new QHBoxLayout;
 50     layoutName->addWidget(label_Name);
 51     layoutName->addWidget(edit);
 52     
 53     // 愛好
 54     QVBoxLayout * layoutHobby = new QVBoxLayout;
 55     layoutHobby->addWidget(label_Hobby);
 56     
 57     QGridLayout * layoutCheckBox = new QGridLayout;
 58     layoutCheckBox->addWidget(checkBox1, 0, 0);
 59     layoutCheckBox->addWidget(checkBox2, 0, 1);
 60     layoutCheckBox->addWidget(checkBox3, 1, 0);
 61     layoutCheckBox->addWidget(checkBox4, 1, 1);
 62     
 63     layoutHobby->addLayout(layoutCheckBox);
 64     
 65     // 提交與放棄按鈕
 66     QHBoxLayout * layoutButton = new QHBoxLayout;
 67     layoutButton->addStretch();
 68     layoutButton->addWidget(okButton);
 69     layoutButton->addWidget(cancelButton);
 70     
 71     // 主布局管理器
 72     QVBoxLayout * mainLayout = new QVBoxLayout;
 73     mainLayout->addLayout(layoutName);
 74     mainLayout->addLayout(layoutHobby);
 75     mainLayout->addLayout(layoutButton);
 76     
 77     setLayout(mainLayout);
 78     
 79 }
 80 
 81 void NewDialog::setOkButtonEnable()
 82 {
 83     if(edit->text() == "")
 84     {
 85         okButton->setEnabled(false);
 86     }
 87     else if(!checkBox1->isChecked() && !checkBox2->isChecked() && 
 88             !checkBox3->isChecked() && !checkBox4->isChecked())
 89     {
 90         okButton->setEnabled(false);
 91     }
 92     else
 93     {
 94         okButton->setEnabled(true);
 95     }
 96 }
 97 
 98 void NewDialog::submitInfo()
 99 {
100     QString Info = "你提交的信息是:\n名字:" + edit->text() +
101             "\n愛好:";
102     if(checkBox1->isChecked()) Info += checkBox1->text() +",";
103     if(checkBox2->isChecked()) Info += checkBox2->text() +",";
104     if(checkBox3->isChecked()) Info += checkBox3->text() +",";
105     if(checkBox4->isChecked()) Info += checkBox4->text() +",";
106     Info[Info.size() - 1] = '.';
107     QMessageBox * msg = 
108             new QMessageBox(QMessageBox::Information,
109                             "提交成功", Info);
110     msg->show();
111     emit infoSubmit(Info);
112 }
113 
114 void NewDialog::cancelDlg()
115 {
116     QMessageBox * msg = 
117             new QMessageBox(QMessageBox::Information,
118                             "退出", "你已經放棄咯");
119     msg->show();
120 }

 

第3行:<QtGui>頭文件

這個頭文件包含了Qt GUI類的定義,包括QCheckBox、QLabel、QDialog等等這些類。

第5行:將parent傳遞給基類構造函數

第8行:設置編碼格式

第16行:字符串中的"&o"

&後跟著的一個字母,這是在標識快捷鍵,按鍵盤ALT+這個字母即可快速定位焦點。

第17行:設置"提交"按鈕無效

這可以將按鈕變灰,無法使用。

第21行:設置標簽的好友部件

用到的函數:void QLabel::setBuddy ( QWidget * buddy )

函數的說明:當鍵盤按下標簽設置的快捷鍵時,將焦點定位到該好友上。

第30~43行:連接信號和槽

在這裡槽的接收對象是this,也就是由自己這個類中指定的槽來執行相應的動作。

第72行:定義對話框的主布局管理器

將子布局對象添加到父布局對象中時,子布局對象就會自動重定義自己的父對象。當主布局裝到對話框中去時,它就會成為對話框的子對象了,它的所有子窗口部件都會重定義自己的父對象,從而變成對話框中的子對象。

第81行:槽,設置"提交"按鈕的有效性

這個函數用來檢查名字是否有寫,同時多選框至少選擇一項。滿足條件之後"提交"按鈕將可以使用,否則變灰色無效。

第98行:槽,用於提示提交信息。

第107~109行:創建一個消息對話框

使用的函數:QMessageBox::QMessageBox ( Iconicon, const QString & title, const QString & text )

函數的說明:構造一個消息框,指定圖標、標題和文本。除了這3個參數,後面還有一些帶有默認值的參數,太多了,所以沒寫上。

第一個參數是指定顯示圖標,有以下圖標

枚舉值

說明

QMessageBox::NoIcon

消息框沒有任何圖標

QMessageBox::Question

消息框帶有一個問號的圖標

QMessageBox::Information

消息框帶有一個感歎號的圖標

QMessageBox::Warning

消息框帶有一個三角形中有一個感歎號的圖標

QMessageBox::Critical

消息框帶有一個X的圖標

第二個參數是標題,第三個參數是文本內容。

創建這個消息框之後還需要show(),它才會顯示。

第114行:槽,用於提示退出信息。

 

其它的估計也不需要多說明了,很簡單的一個小程序。

 

主函數代碼:

 

運行結果已經在上面說明了。

在類定義中,signals和public slots,這2個關鍵字實際上都是Qt的宏。

 

在寫完所有信息之後,如果想要按回車來提交信息的話,可以在實例化"提交"按鈕之後添加這一個函數:

okButton->setDefault(true);

設置按鈕為默認按鈕,使得當按下Enter時,自動按下該按鈕。

 

如果想你改變對話框的大小的話,可以使用這兩個函數:

setFixedHeight(200);

setFixedWidth(200);

這兩個函數分別指定對話框的高和寬,因為類繼承了QDialog,所以可以直接調用。

 

好咯,就到這裡吧~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved