为了应对最近的比赛,但对很对 GUI 系统都不怎么熟悉,而且又要用 C++ 进行项目核心代码的编辑。RetVal 希望团队做出一个很炫的图形界面,不过,对 C++ 的窗口系统还真的不熟悉。于是尝试用 Qt 和 HTML 5 来进行界面的编程,也算是一个新挑战。

不过似乎关于 Qt 和 HTML 5 的中文资料还不多,于是整理一下笔记吧。这个博客也很久没更新了……

新建项目

要新建 Qt HTML 5 应用程序,可以直接在 Qt Creator 里新建“HTML 5 Application”,但要注意的是,这样新建的Qt程序并没有包含菜单栏之类控件,完全是一个 Qt 窗口里面有一个 Webkit 组件。但有一个好处是,新建的 Webkit 组件被 Qt Creator 对移动设备(主要是触摸屏设备)优化过,可以应用于桌面端和手机端。但也由于针对了触摸屏,所以,默认禁用了“hover”事件(即鼠标悬停事件)。使我还纠结了很久为什么 Qt Webkit 不支持鼠标悬停事件。

如果我们是针对桌面端开发,那么其实不必要考虑Webkit的移动支持,因此,我们可以自己新建一个 Qt GUI 项目。此时,要注意的是在 .pro 文件中添加对 Webkit 的编译支持。

参考 .pro 文件如下:

#-------------------------------------------------

#

# Project created by QtCreator 2012-04-02T09:29:02

#

#-------------------------------------------------

QT += core gui webkit

TARGET = ColdTest

TEMPLATE = app

SOURCES += main.cpp\

mainwindow.cpp \

sampleobject.cpp

HEADERS += mainwindow.h \

sampleobject.h

FORMS += mainwindow.ui

uiml.source = html

uiml.target = .

DEPLOYMENTFOLDERS = uiml

defineTest(qtcAddDeployment) {

for(deploymentfolder, DEPLOYMENTFOLDERS) {

item = item$${deploymentfolder}

itemsources = $${item}.sources

$$itemsources = $$eval($${deploymentfolder}.source)

itempath = $${item}.path

$$itempath= $$eval($${deploymentfolder}.target)

export($$itemsources)

export($$itempath)

DEPLOYMENT += $$item

}

MAINPROFILEPWD = $$PWD

win32 {

copyCommand =

for(deploymentfolder, DEPLOYMENTFOLDERS) {

source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)

source = $$replace(source, /, \\)

sourcePathSegments = $$split(source, \\)

target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)

target = $$replace(target, /, \\)

!isEqual(source,$$target) {

!isEmpty(copyCommand):copyCommand += &&

isEqual(QMAKE_DIR_SEP, \\) {

copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"

} else {

source = $$replace(source, \\\\, /)

target = $$OUT_PWD/$$eval($${deploymentfolder}.target)

target = $$replace(target, \\\\, /)

copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"

}

}

}

!isEmpty(copyCommand) {

copyCommand = @echo Copying application data... && $$copyCommand

copydeploymentfolders.commands = $$copyCommand

first.depends = $(first) copydeploymentfolders

export(first.depends)

export(copydeploymentfolders.commands)

QMAKE_EXTRA_TARGETS += first copydeploymentfolders

}

} else:unix {

desktopfile.path = /usr/share/applications

copyCommand =

for(deploymentfolder, DEPLOYMENTFOLDERS) {

source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)

source = $$replace(source, \\\\, /)

macx {

target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)

} else {

target = $$OUT_PWD/$$eval($${deploymentfolder}.target)

}

target = $$replace(target, \\\\, /)

sourcePathSegments = $$split(source, /)

targetFullPath = $$target/$$last(sourcePathSegments)

!isEqual(source,$$targetFullPath) {

!isEmpty(copyCommand):copyCommand += &&

copyCommand += $(MKDIR) \"$$target\"

copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"

}

}

!isEmpty(copyCommand) {

copyCommand = @echo Copying application data... && $$copyCommand

copydeploymentfolders.commands = $$copyCommand

first.depends = $(first) copydeploymentfolders

export(first.depends)

export(copydeploymentfolders.commands)

QMAKE_EXTRA_TARGETS += first copydeploymentfolders

}

installPrefix = /opt/$${TARGET}

for(deploymentfolder, DEPLOYMENTFOLDERS) {

item = item$${deploymentfolder}

itemfiles = $${item}.files

$$itemfiles = $$eval($${deploymentfolder}.source)

itempath = $${item}.path

$$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)

export($$itemfiles)

export($$itempath)

INSTALLS += $$item

}

icon.files = $${TARGET}.png

icon.path = /usr/share/icons/hicolor/64x64/apps

desktopfile.files = $${TARGET}.desktop

target.path = $${installPrefix}/bin

export(icon.files)

export(icon.path)

export(desktopfile.files)

export(desktopfile.path)

export(target.path)

INSTALLS += desktopfile icon target

}

export (ICON)

export (INSTALLS)

export (DEPLOYMENT)

export (TARGET.EPOCHEAPSIZE)

export (TARGET.CAPABILITY)

export (LIBS)

export (QMAKE_EXTRA_TARGETS)

}

qtcAddDeployment()

项目依赖部分(qtcAddDeployment)是参考了 Qt Creator 为 HTML 5 Application 项目自动生成的代码。

然后,在项目根目录下新建文件夹 html ,把用到的 HTML 5 构建的文件添加到这里。

初始化 QtWebkit

新建 Qt GUI 项目后,默认应该会生成 MainWindow 类,简单起见,直接以 MainWindow 类为基础,用 Qt Desginer 画好界面。

然后回到 MainWindow 类(或者你自己新建的其他类)的初始化函数中,添加slot:

private slots:

void addToJavaScript();

然后,方法实现为:

void MainWindow::addToJavaScript()

{

ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("Qt", qt);

ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("app", this);

}

这个函数是为 Webkit 组件建立页面的时候,把 C++ 对象包装为 JavaScript对象传递给 JavaScript 调用的。这里,即是把 qt(一个QApplication 对象)、app(QMainWindow 对象)添加到 QtWebkit 的 JavaScript 运行环境中。

然后,添加本地路径调整函数:(这里省略头文件的声明了)

QString MainWindow::adjustPath(const QString &path)

{

#ifdef Q_OS_UNIX

#ifdef Q_OS_MAC

if (!QDir::isAbsolutePath(path))

return QCoreApplication::applicationDirPath()

+ QLatin1String("/../Resources/") + path;

#else

const QString pathInInstallDir = QCoreApplication::applicationDirPath()

+ QLatin1String("/../") + path;

if (pathInInstallDir.contains(QLatin1String("opt"))

&& pathInInstallDir.contains(QLatin1String("bin"))

&& QFileInfo(pathInInstallDir).exists()) {

return pathInInstallDir;

}

#endif

#endif

return path;

}

这段代码也是参考 HTML 5 Application 生成的函数,可以把相对项目路径转化为 QUrl 标识。

于是,初始化 WebView 的时候就可以:

ui->webView->setUrl(QUrl(MainWindow::adjustPath("html/ui.html")));

来调用 html 文件夹下面的 ui.html 文件了。

到这里,一个 Qt HTML 5 程序的初始化工作就完成了。可以编辑一下 ui.html 文件试用一下 Qt Webkit ~

qt中新增html,Qt和HTML笔记:初始化相关推荐

  1. Qt中moc问题(qt moc 处理 cpp)

    Qt编译常见的错误: 编译报错: 1>Linking... 1>cmmwindow.obj : error LNK2001: unresolved external symbol &quo ...

  2. qt linux excel文件读取显示,qt中写入excle?QT怎样读写excel-CSDN论坛

    如何通过Qt 创建一个excel文件 首先,我们打开前文所的工目. 然后,我们在界面设计,加入一个label用于显示,要保存的目录.注意设置下相应的界面布局. 然后,我们在mainwindow.h类中 ...

  3. 【Qt】Qt中JSON简介

    00. 目录 文章目录 00. 目录 01. JSON简介 02. JSON Support in Qt 03. JSON类 04. 附录 01. JSON简介 1.1 JSON概述 JSON(Jav ...

  4. 压缩包安装mySQL 与 Qt中使用mySQL

    文章目录 安装mySQL mySQL压缩包安装 Qt中使用mySQL Qt中的mySQL驱动编译 test 安装mySQL mySQL压缩包安装 参考: https://blog.csdn.net/S ...

  5. QT中OpenGL开发起步

    OpenGL中环境搭建 近期由于需要做一个GUI展示的OpenGL程序,因此想到用QT来做界面,需要在QT中写OpenGL,配完环境后,在这里总计一下. QT基础 总体看来,QT的版本较为混乱,有时候 ...

  6. TX2(Linux)在Qt中调用python函数

    实验环境:TX2使用JetPack-L4T-3.3-linux-x64_b39进行环境安装 详情参考:Jetpack3.3刷机 安装的python版本为3.5.2 1.创建Qt工程 在Qt中创建一个Q ...

  7. Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)

    前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...

  8. Qt登录服务器验证,QT笔记:QT模拟网页交互过程中的token验证机制

    在平时上网时,我们登陆一些网站后,为了校验客户端的身份.保障数据的安全性,服务器会给浏览器发送一个token值,这个token值就是一张令牌,你可以把它看成一张通行证,有了它你才能对该网站进行提交数据 ...

  9. QT中IDirect3DDevice9的Present方法失败情况的处理笔记

    这几天在试着使用QT做编辑器,然后打算使用Irrlicht作为渲染引擎.结果在集成的时候遇到了问题. 使用了Irrlicht论坛里面有人提供的QIrrlichtWidget,结果什么都画不出来.仔细跟 ...

最新文章

  1. Centos7 安装 nginx 服务器的两种方式
  2. XML-RPC远程方法调用
  3. windows使用nginx实现网站负载均衡测试实例
  4. linux vim verilog,vim下好用的verilog插件:)( 更新) - [IC]
  5. 计算机课件知识,计算机基础知识1认识计算机课件.ppt
  6. B 站疯传!P8技术大佬分享了20个免费Java课程,白拿不谢!!
  7. Beacon Mountain 测试版 – 常见问题解答
  8. AI入门,从每个人都应该学的AI第一课开始
  9. 嵌入式Linux上没有x-window系统环境运行qt程序的方法
  10. 生成特定区间的随机数
  11. 提取SHP格式文件折点(拐点)地理坐标(经纬度)
  12. android源码在线
  13. .net 开源混淆器 ConfuserEx
  14. Python爬虫自己写项目之:爬取火车站的时刻表和票务信息
  15. win10u盘被写保护怎么解除_Win10系统下U盘写保护应该如何破除!
  16. 泛函分析 04.01 有界线性算子 - 有界线性算子与有界线性泛函
  17. 计算机文件右击怎么显示打开方式,怎么删除Win10文件右键菜单打开方式中已卸载程序选项?...
  18. python修改系统时间_python修改操作系统时间的方法
  19. snapchat_如何截屏和共享Snapchat快照
  20. 从零学习Belief Propagation算法(三)

热门文章

  1. python把.CSV文件转换成.JSON格式文件并格式化储存
  2. C++音乐播放器:MCI库的使用
  3. Java数据结构:图
  4. SQL Extractor 数据库修复取证大师软件功能介绍
  5. html5中给视频添加字幕
  6. 【ESP32_8266_WiFi (二)】接入点模式、无线终端模式
  7. Kubenetes1.13.1集群部署 --01基于Kubeadm搭建Kubernetes
  8. echarts 点击地图画布空白处 触发事件
  9. gp-greenplum-vacuum-资源回收-AO表空间回收
  10. input文本框输入与输出(简单举例)