《C++ GUI Qt 4 编程》 笔记(六)

原创 2016年08月29日 12:42:00

博客搬家自 http://zhouyuanchao.com/wordpress/archives/77


第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渲染
这时,假如选择框的大小改变,而窗口大小没有改变时,则只需要绘制一张纹理和一个选择框,模型并不需要频繁渲染。


相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

GMT时间与北京时间的转换

文章参考了很多其他技术网站,然后自己再根据需求,调试出来的

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android时间处理详解

Android时间详解 Java Calendar详解 Java Date Greenwich:格林威治/格林尼治,是位于伦敦市中心东南部的一个区,1675国王查理二世在此建立了皇家格林尼治天文台,1...

《C++ GUI Qt 4 编程》 笔记(三)

博客搬家自 http://zhouyuanchao.com/wordpress/archives/69 第10章 项视图类 MVC 模型代表数据集,它对需要查看数据的获取以及任何存储的改变负...

《C++ GUI Qt 4 编程》 笔记(五)

博客搬家自 http://zhouyuanchao.com/wordpress/archives/74 第15章 网络 QFtp QHttp QTcpSocket QSslSocket Q...

《C++ GUI Qt 4 编程》 笔记(二)

博客搬家自 http://zhouyuanchao.com/wordpress/archives/66 第二部分 Qt中级 第6章 布局管理 分组布局 QStackedLayout 对一组子...

C++ GUI Qt 4编程(第二版)

C++ GUI Qt 4编程(第二版)(中文高清PDF扫描版)+随书源码 利用奇趣科技公司(Trolltedl)的Qt应用程序框架,可以构建出工业级的跨平台应用程序。在源代码不经任何修改的情...

C++ GUI Programming with Qt 4 学习笔记

  • 2013年08月24日 21:08
  • 28.33MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C++ GUI Qt 4 编程》 笔记(六)
举报原因:
原因补充:

(最多只允许输入30个字)