《C++ GUI Qt 4 編程》 筆記(六)

第17章 提供在線幫助

工具提示

findButton->setToolTip(tr("Find next"));

newAction = new QAction(tr("&New"), this);
newAction->setToolTip(tr("New document"));

狀態提示 顯示在狀態欄上

newAction->setStatusTip(tr("Create a new document"));

What's This? 文本幫助

dialog->setWhatsThis(tr("<img src=...")); // 可以使用HTML對文本進行格式化

當處於what's this模式下時(windows 標題欄問號按鈕 或shift + f1)
單擊窗體,將顯示設置的幫助文本

QWhatsThis::createAction();

當用戶按下F1鍵或單擊Help菜單項時,應用程序主窗口會調用help()槽

void MainWindow::help()
{
	QUrl url(directoryOf("doc").absoluteFilePath("index.html"));
	url.setScheme("file");
	url.setFragment("editing"); // 錨 <a name="editing"></a>
	QDesktopServices::openUrl(url);
}
QDir dir(QApplication::applicationDirPath());
dir.cdUp(); //上級目錄

QTextBrowser

QWidget::setAttribute(Qt::WA_DeleteOnClose)
// 通常模式對話框不允許和這個應用程序中的其他任何窗口進行交互
// 以下代碼允許這種交互
QWidget::setAttribute(Qt::WA_GroupLeader)

textBrowser->setSearchPaths(QStringList() << path << ":/images");
textBrowser->setSource(page);
// 只要頁面發生改變,就會發送sourceChanged()信號
connect(textBrower, SIGNAL(sourceChanged(const QUrl&)),
	this, SLOT(updateWindowTitle));

textBrowser->documentTitle();

Qt Assitant庫
.pro
CONFIG += assistant

// 參數指定Qt Assistant程序所在路徑
// 空字符串表示在PATH環境變量中查找
QAssistantClient* assistant = new QAssistantClient("");
assistant->showPage(path);

第三部分 Qt高級

第19章 Unicode

QTextCodec::codecForLocale() 獲得本地字符集

讓應用程序感知翻譯
1. tr()
2. 程序啓動時,載入一個翻譯文件.qm

另一種方式:

QCoreApplication::translate("上下文", "原文本", "註釋");

lupdate工具

不要含有變量

const char* appName = "xxx";
tr(appName); // 錯誤

應該這樣

const char* appName = QT_TR_NOOP("xxx");
tr(appName);

QT_TRANSLATE_NOOP("上下文", "xxx");

禁止const char* 到QString的隱含轉換
在包含任意Qt頭文件之前預先定義:
QT_NO_CAST_FROM_ASCII
或在.pro中
DEFINES += QT_NO_CAST_FROM_ASCII

// 加載翻譯文件
QTranslator appTranslator;
appTranslator.load("myapp_" + QLocale::system().name, qmPath);
app.installTranslator(&appTranslator);

QLocale 提供本地化的數字和日期以及時間格式

動態改變語言
只需重新加載翻譯文件,然後重新設置需要翻譯的文本

翻譯應用程序:
1. 運行lupdate,從應用程序的源代碼中提取所有用戶可見的字符串
2. 使用Qt Linguist翻譯應用程序
3. 運行lrelease,生成二進制的.qm文件,應用程序可以使用QTranslator加載這個文件

在.pro中加入需要支持的語言
當第一次運行lupdate時會創建這兩個文件xml格式
ts - translate source
qm - Qt Message
TRANSLATIONS = spreadsheet_de.ts spreadSheet_fr.ts

lupdate -verbose spreadsheet.pro

CODECFORTR = ...
QTextCodec::setCodecForTr()

lrelease -verbose spreadsheet.pro

第19章 自定義外觀

三種方法重新定義Qt內置窗口部件的外觀
1. 子類化窗口部件類
2. 子類化QStyle或者一個預定義的風格比如QWindowStyle,Qt通過這種方法爲不同平臺提供基於平臺的外觀
3. Qt樣式表 受CSS啓發

樣式表作用於上層的當前激活的QStyle上,因爲創建樣式表不引入任何子類,所以它們適合對現有窗口部件做微小的定製。

例如:
想在應用程序中的所有QLineEdit中使用黃色作爲背景色

QLineEdit
{
	background-color:yellow;
}
// 爲整個應用程序設置一個樣式表
qApp->setStyleSheet("QLineEdit {background-color:yellow;}");

lineEdit->setStyleSheet("background-color:yellow;");

QObject::setProperty()

QStyle
內置樣式類:
QStyle
|- QCommonStyle
|  |-QWindowStyle
|  |-QCleanlookStyle
|  |-QMacStyle
|  |-QPlastiqueStyle
|  |-QWindowsXPStyle
|  |-QWindowsVistaStyle
|
|- QMotifStyle
|- QCDEStyle

class MyPushButton : public QWidget

void MyPushButton::paintEvent(QPaintEvent* event)
{
	QPainter painter(this);
	QStyleOptionButton option;
	option.initFrom(this);
	if (isFlat())
		option.features |= QStyleOptionButton::Flat;
	option.text = text();
	style()->drawControl(QStyle::CE_PushButton, &option, painter, this);
}

QApplication::setStyle() // 設置整個應用程序的樣式
QWidget::setStyle() // 爲個別窗口部件設置樣式

drawControl()函數被各種QStyle的子類重新實現,用於繪製窗口部件
第20章 三維繪圖 OpenGL

1. 子類化QGLWidget
2. 實現幾個虛函數
3. 連接QtOpenGL OpenGL庫

// 構造函數中
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));

// 重寫QGLWidget::initializeGL()
qglClearColor(Qt::black);
glShadeMode(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

// 重寫QGLWidget::resizeGL()
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW());

// 重寫QGLWidget::paintGL()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw(); // 自定義函數,使用OpenGL函數繪圖

// 選擇鼠標點處的面方法見書371頁

// main函數
QApplication app(argc, argv);
if (!QGLFormat::hasOpenGL())
	return 1;
MyWidget win;
win.setWindowTitle(QObject::tr("Title"));
win.resize(300, 300);
win.show();
return app.exec();

.pro
QT += opengl

OpenGL QPainter結合
在paintEvent()函數繪製
1. 創建一個QPainter
2. 使用QPainter繪製背景
3. 保存OpenGL狀態
4. 使用OpenGL操作繪製場景
5. 恢復OpenGL狀態
6. 使用QPainter繪製前景
7. 銷燬QPainter

QGLWidget::renderText()

使用幀緩存對象生成疊加
基本思路:
1. opengl渲染到紋理
2. 將紋理繪製到窗口
3. 將選擇框繪製到窗口
假如只有窗口大小改變時才重新opengl渲染
這時,假如選擇框的大小改變,而窗口大小沒有改變時,則只需要繪製一張紋理和一個選擇框,模型並不需要頻繁渲染。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章