## 7.6 問題與解答
問:內建對話框的控件怎么改文本?
比如說 QMessageBox::critical(this, QObject::tr("警告!"), QObject::tr("請正 確輸入!"));我要把顯示的 OK 按鈕文本改為“確定”,怎么獲得 OK 的指針?
答:在本章前面已經講到,這種情況下不要使用 QMessageBox 類的靜態方法,下面是 一個類似這種需求時的示例代碼:
```
QMessageBox msgBox;
QPushButton *connectButton = msgBox.addButton(tr("Connect"), QMessageBox::ActionRole);
QPushButton *abortButton = msgBox.addButton(QMessageBox::Abort);
msgBox.exec();
if (msgBox.clickedButton() == connectButton)
{
// connect
}
else if (msgBox.clickedButton() == abortButton)
{
// abort
}
```
注意重點是 QMessageBox 類的 addButton()方法的使用,其原型可以通過查閱幫助獲得。
問:能不能通過對話框的 Title 索引它?
比如我有一個主窗口,其中打開了幾個子窗口,我是否可以通過它們的標題來得到它們的指針,繼而引用它們?
答:從你的表述來看,你的問題可以歸結為如何通過子窗口的 windowTitle 屬性來索 引并控制不同的子窗口。
實際上我們很少通過 windowTitle 屬性來區分子窗口,因為往往這個屬性的值并不是 唯一的,而是可能重復的。所以我們一般是通過 objectName 這個屬性來索引不同的子窗 口,繼而可以獲得其它的屬性值,包括 windowTitle。
可以通過 QObject::findChild()、QObject::findChildren()或者是 qFindChild()、 qFindChildren()方法來索引子窗口,請看下面的例子,一個 QPushButton 類對象,它的 objectName 屬性為"button1",下面的代碼使用 findChild()方法獲得了這個子窗口的指針。
```
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
```
要獲得父窗口的所有子窗口,可以使用 findChildren()方法,下面的代碼取得了 parentWidget 的所有類別為 QPushButton 的子窗口:
```
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
```
需要注意的是 QObject::findChild()、QObject::findChildren()不能與 MSVC6 一起使用,如果要與 MSVC6 配合,則可以換成 qFindChild()、qFindChildren(),它們實現相同的功能。
問:請問我在 Qt Designer 里面設置一個 OKbutton,我將信號 clicked()和槽 accept()相連 接,但為什么運行后點它實現的是關閉對話框的功能呢
答:可以看一下 accept()這個槽的定義:
```
void QDialog::accept () [virtual slot]
//Hides the modal dialog and sets the result code to Accepted.
```
確切說,它是隱藏(hide)這個對話框,看起來的效果是關閉了這個對話框,但是在對話框關閉后,其對象仍然存在,并沒有被銷毀。 問:如何創建一個不帶標題欄的 QMessageBox? 答:可以使用下面的代碼創建,不是使用 QMessageBox 類的靜態方法。
```
QMessageBox mgb ;
mgb.setWIndowFlags(Qt::FrameLessTopHint) ;
mgb.exec() ;
```
問:如何讓一個對話框總在所有窗口的最前面顯示?
答:最簡單的方法只需添加一句代碼:
```
this->setWindowFlags(Qt::WindowStaysOnTopHint);
```
問:在 Qt4 中如何為對話框設置背景?
答:這個問題值得總結一下。大致有以下的思路和方法:
1\.重寫 paintEvent()事件
在該事件中用畫筆 QPainter 重畫整個背景。該方法比較復雜,不建議初學者采 用。
2\.使用調色板類 QPalette
```
//以下代碼中 pWidget 為指向要設置的 widget 的指針。
QPalette palette = pWidget->palette();
palette->setBrush(QPalette::Active,QPalette::Window,QBrush(Qt::red))
pWidget->setPalette(palette);
pWidget->setAutoBackground(true);
```
推薦使用這種方法,大家可以查看一下 setBrush()方法的定義:
```
Palette::setBrush ( ColorGroup group, ColorRole role, const QBrush &brush )
```
這個是一個重載版本,最為重要的是第二個參數,可以設置許多不同的類型。舉例來說, 如果 pWidget 指向的是一個 QListWidget 或者 QTextEdit 對象,如果把第二個參數設置 成 QPalette::Text,則是設置其中文字的顏色;如果第二個參數是 QPalette::BrightText,則是設置該對象被選中時,其文字的顏色;如果第二個參數 QPalette::Bright 則表示設置選中該 對象時,高亮背景的顏色或者圖片。該函數的功能是很強大的。
3\.使用樣式表。
```
pWidget->setStyleSheet("background-color:blue;"); //設置背景顏色 pWidget->setStyleSheet("background-image:url(:/folder/show.bmp);"); //設置背景圖片
```
此外,還有一些很有意思的方法,比如用 setHtml(),insetHtml()這種用 HTML 語言的方式來指定的等等,大家可以多查查幫助文檔搜索一下 。
4\.具體例子
```
//設置為固定顏色
QPalette pal = pWidget->palette();
pal.setColor(QPalette::Background, QColor(0,0,0)); //黑色
pWidget->setPalette( pal );
//背景圖片
QPalette pal = pWidget->palette();
pal.setBrush( QPixmap(圖片文件名) ); //黑色
pWidget->setPalette( pal );
```
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區