QtWayland/zh: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
[[QtWayland|English]] | '''简体中文'''
[[:QtWayland|English]] | '''简体中文'''


=什么是QtWayland?=
= 什么是QtWayland? =


QtWayland是封装了Wayland功能的Qt 5模块。QtWayland被分为一个客户端(client)和一个服务端(server)。客户端是wayland平台插件,提供了运行Wayland客户端Qt程序的方法。服务端是QtCompositor应用程序接口(<span class="caps">API</span>),允许用户编写自己的compositors。
QtWayland是封装了Wayland功能的Qt 5模块。QtWayland被分为一个客户端(client)和一个服务端(server)。客户端是wayland平台插件,提供了运行Wayland客户端Qt程序的方法。服务端是QtCompositor应用程序接口(API),允许用户编写自己的compositors。


==什么是Wayland==
== 什么是Wayland ==


Wayland是一个用C库实现的为了使Compositor和Client沟通的协议。要获得更多详细信息,请访问 [http://wayland.freedesktop.org/ Wayland项目主页] ''[wayland.freedesktop.org]''
Wayland是一个用C库实现的为了使Compositor和Client沟通的协议。要获得更多详细信息,请访问 &quot;Wayland项目主页&amp;quot;:http://wayland.freedesktop.org/


=从哪里找到QtWayland代码?=
= 从哪里找到QtWayland代码? =


[http://qt.gitorious.org/qt/qtwayland Gitorious仓库] ''[qt.gitorious.org]''
&quot;Gitorious仓库&amp;quot;:http://qt.gitorious.org/qt/qtwayland


=怎样构建QtWayland?=
= 怎样构建QtWayland? =


==桌面构建指令==
== 桌面构建指令 ==


===设置构建环境===
=== 设置构建环境 ===


第一步,选择一个合适的新的Linux发行版。我使用Ubuntu 12.04,比这个新的更好。
第一步,选择一个合适的新的Linux发行版。我使用Ubuntu 12.04,比这个新的更好。
Line 25: Line 25:
我做的第一件事是创建一个Wayland安装目录和一个设置环境的文件:
我做的第一件事是创建一个Wayland安装目录和一个设置环境的文件:


~/Apps/Wayland/wayland.sourceme
<sub>/Apps/Wayland/wayland.sourceme
<br /><code>#wayland.sourceme<br />WLD=$HOME/Apps/Wayland # change this to another location if you prefer<br />LD_LIBRARY_PATH=$WLD/lib<br />PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/<br />ACLOCAL=&quot;aclocal -I $WLD/share/aclocal&amp;quot;<br />PATH=$WLD/bin:$PATH<br />XDG_RUNTIME_DIR=/tmp
<br />export WLD LD_LIBRARY_PATH PKG_CONFIG_PATH ACLOCAL PATH XDG_RUNTIME_DIR</code>
<br />之后用这个文件设置您的工作环境:<br />_source</sub>/Apps/Wayland/wayland.sourceme_


之后用这个文件设置您的工作环境:<br />''source ~/Apps/Wayland/wayland.sourceme''
=== 编译依赖的库 ===


===编译依赖的库===
您需要的大部分依赖库都已经发布了。但是仍然没有包含在最新的Linux发行版中。所以您需要编译它们。这里是编译它们的指南:
 
==== wayland ====
 
<code>git clone git://anongit.freedesktop.org/wayland/wayland<br />cd wayland<br />git checkout -b branch-1.0.3 1.0.3<br />#this prevents autogen.sh to fail while testing for exiting folders<br />mkdir -p $WLD/share/aclocal<br />./autogen.sh —prefix=$WLD<br />make<br />make install</code>


您需要的大部分依赖库都已经发布了。但是仍然没有包含在最新的Linux发行版中。所以您需要编译它们。这里是编译它们的指南:
==== drm ====
 
<code>git clone git://anongit.freedesktop.org/git/mesa/drm<br />cd drm<br />git checkout -b branch-2.4.40 2.4.40<br />./autogen.sh —prefix=$WLD<br />make &amp;&amp; make install</code>
 
==== mesa ====


====wayland====
<code>git clone git://anongit.freedesktop.org/mesa/mesa<br />cd mesa<br />git checkout 9.0<br />./autogen.sh —prefix=$WLD —enable-gles2 —disable-gallium-egl —with-egl-platforms=x11,wayland,drm —enable-gbm —enable-shared-glapi —with-gallium-drivers=r300,r600,swrast,nouveau<br />make &amp;&amp; make install</code>


====drm====
==== libxkbcommon ====


====mesa====
<code>git clone git://people.freedesktop.org/xorg/lib/libxkbcommon.git<br />cd libxkbcommon/<br />git checkout -b branch-0.2.0 xkbcommon-0.2.0<br />./autogen.sh —prefix=$WLD —with-xkb-config-root=/usr/share/X11/xkb<br />make &amp;&amp; make install</code>


====libxkbcommon====
==== weston(可选) ====


====weston(可选)====
<code>git clone git://anongit.freedesktop.org/wayland/weston<br />cd weston<br />git checkout -b branch-1.0.3 1.0.3<br />./autogen.sh —prefix=$WLD<br />make<br />make install -k</code>


===Qt 5.0.0依赖===
=== Qt 5.0.0依赖 ===


对于Qt,您可以使用于预编译的5.0.0二进制文件,或者从最新的Qt 5.0.0(stable分支)构建,这里不使用wayland.source环境。您至少需要的Qt 5.0.0模块有:<br /> qtbase<br /> qtjsbackend<br /> qtdeclarative
对于Qt,您可以使用于预编译的5.0.0二进制文件,或者从最新的Qt 5.0.0(stable分支)构建,这里不使用wayland.source环境。您至少需要的Qt 5.0.0模块有:<br />qtbase<br />qtjsbackend<br />qtdeclarative


如果您遇到了关于libGL和undefined references链接错误,可能是需要编译Qt5并且链接自己编译的mesa库,可能是由于编译和安装mesa的方式,配置脚本需要明确的定义openGL的版本,使用: ./configure -opengl es2
如果您遇到了关于libGL和undefined references链接错误,可能是需要编译Qt5并且链接自己编译的mesa库,可能是由于编译和安装mesa的方式,配置脚本需要明确的定义openGL的版本,使用: ./configure -opengl es2


===构建QtWayland模块===
=== 构建QtWayland模块 ===


一旦您构建好了Qt 5,之后获取最新的QtWayland模块代码,使用qmake配置,这次是用wanyland.source环境。确定您使用的qmake是刚构建好的Qt 5中的。这将确定您使用了特别的OpenGL和Wayland版本来构建Wayland平台插件和QtCompositor API。
一旦您构建好了Qt 5,之后获取最新的QtWayland模块代码,使用qmake配置,这次是用wanyland.source环境。确定您使用的qmake是刚构建好的Qt 5中的。这将确定您使用了特别的OpenGL和Wayland版本来构建Wayland平台插件和QtCompositor API。


==Raspberry Pi编译指南==
<code>source <sub>/Apps/Wayland/wayland.sourceme<br />git clone git://gitorious.org/qt/qtwayland.git<br />cd qtwayland<br />qmake<br />make<br />make install</code>
 
敬请期待。


=怎样使用QtWayland?=
<br />h2. Raspberry Pi编译指南
<br />敬请期待。


==作为Wayland客户端运行Qt程序==
<br />h1. 怎样使用QtWayland?
<br />h2. 作为Wayland客户端运行Qt程序
<br />当您编译完QtWayland模块,您将得到一个新的wayland平台插件。要使用它,您首先需要有一个已经运行的Wayland compositor。这可以是一个Wayland项目提供的Weston reference compositor,或是QtWayland提供的Qt example compositor。不管怎样,作为一个应用程序开发者,您需要做的唯一一件事是把您的程序作为wayland客户端运行:
<br /><code>source</sub>/Apps/Wayland/wayland.sourceme<br />./application -platform wayland</code>


当您编译完QtWayland模块,您将得到一个新的wayland平台插件。要使用它,您首先需要有一个已经运行的Wayland compositor。这可以是一个Wayland项目提供的Weston reference compositor,或是QtWayland提供的Qt example compositor。不管怎样,作为一个应用程序开发者,您需要做的唯一一件事是把您的程序作为wayland客户端运行:
== 创建和运行您自己的Qt5 Wayland Compositor ==


==创建和运行您自己的Qt5 Wayland Compositor==
=== 运行例子中的compositor ===


===运行例子中的compositor===
QtWayland模块中提供了几个compositor样例,演示了QtCompositor是如何工作的。这些样例在QtWayland模块的example目录中,如果您使用qmake时添加了&amp;quot;wayland-compositor&amp;quot;到CONFIG变量。


QtWayland模块中提供了几个compositor样例,演示了QtCompositor是如何工作的。这些样例在QtWayland模块的example目录中,如果您使用qmake时添加了“wayland-compositor“到CONFIG变量。
<code>qmake CONFIG+=wayland-compositor<code>


这些例子示范了服务器端(server side)的Wayland,所以您不需要使用wayland平台插件,不管您是在那个平台运行。通常这些平台是eglfs、 kms或者您想运行于X11 xcb。
这些例子示范了服务器端(server side)的Wayland,所以您不需要使用wayland平台插件,不管您是在那个平台运行。通常这些平台是eglfs、 kms或者您想运行于X11 xcb。


如果您想在X11中运行qml-compositor: 您需要按下面的方式运行:
如果您想在X11中运行qml-compositor: 您需要按下面的方式运行:
</code>source ~/Apps/Wayland/wayland.sourceme<br />cd qtwayland/examples/qml-compositor<br />./qml-compositor -platform xcb<code>


现在,您的Wayland compositor运行了,您可以连接和显示Wayland客户端了。
现在,您的Wayland compositor运行了,您可以连接和显示Wayland客户端了。


===创建您自己的compositor===
=== 创建您自己的compositor ===


创建Wayland compositor和控制相关事件的应用程序接口在QtWayland类的WaylandCompositor中。它的构造函数需要QWindow对象指针作为主参数。这使实现compositor更加灵活。
创建Wayland compositor和控制相关事件的应用程序接口在QtWayland类的WaylandCompositor中。它的构造函数需要QWindow对象指针作为主参数。这使实现compositor更加灵活。
Line 83: Line 98:
* 基于QWidow:实例将会用于配置WaylandCompositor对象。
* 基于QWidow:实例将会用于配置WaylandCompositor对象。
* 基于QWidget:这种情况中,基础的widget窗体句柄将被使用。
* 基于QWidget:这种情况中,基础的widget窗体句柄将被使用。
* 基于QML:您的C++程序将使用一个QQuickView对象类配置WaylandCompositor。直到些这篇文章的时候,还没有仅使用QML创建compositor的方法。
* 基于QML:您的C+''程序将使用一个QQuickView对象类配置WaylandCompositor。直到些这篇文章的时候,还没有仅使用QML创建compositor的方法。
 
WaylandCompositor是纯抽象虚类,它不能用来创建实例。实现compositor的通用方法是继承自WaylandCompositor并实现这个方法*void surfaceCreated(WaylandSurface *surface)*。
 
这个方法会在每次新客户端连接的时候执行(例如程序启动请求compositor服务时)。作为一个WaylandSurface对象。这里有一些这个对象生成的信号,被compositor处理,叫做:
 
* mapped(): 当client连接到compositor时发射。
 
* damaged(): <span class="caps">TODO</span>
 
* destroyed(): 当client退出时发射(即应用程序退出时)
 
* unmapped(): <span class="caps">TODO</span>


* extendedSurfaceReady(): <span class="caps">TODO</span>
<br />WaylandCompositor是纯抽象虚类,它不能用来创建实例。实现compositor的通用方法是继承自WaylandCompositor并实现这个方法*void surfaceCreated(WaylandSurface '''surface)'''。
<br />这个方法会在每次新客户端连接的时候执行(例如程序启动请求compositor服务时)。作为一个WaylandSurface对象。这里有一些这个对象生成的信号,被compositor处理,叫做:


工程文件需要使用compositor模块(即在.pro文件中添加QT += compositor)。有趣的是在写这篇文章的时候,需要注意的是有些QML相关的API只能在工程文件中添加宏定义(即DEFINES += QT_COMPOSITOR_QUICK)。
<br />* mapped(): 当client连接到compositor时发射。
<br />* damaged(): TODO
<br />* destroyed(): 当client退出时发射(即应用程序退出时)
<br />* unmapped(): TODO
<br />* extendedSurfaceReady(): TODO
<br />工程文件需要使用compositor模块(即在.pro文件中添加QT''= compositor)。有趣的是在写这篇文章的时候,需要注意的是有些QML相关的API只能在工程文件中添加宏定义(即DEFINES += QT_COMPOSITOR_QUICK)。


===独立运行compositor===
=== 独立运行compositor ===


<span class="caps">TODO</span>
TODO

Revision as of 09:34, 24 February 2015

English | 简体中文

什么是QtWayland?

QtWayland是封装了Wayland功能的Qt 5模块。QtWayland被分为一个客户端(client)和一个服务端(server)。客户端是wayland平台插件,提供了运行Wayland客户端Qt程序的方法。服务端是QtCompositor应用程序接口(API),允许用户编写自己的compositors。

什么是Wayland

Wayland是一个用C库实现的为了使Compositor和Client沟通的协议。要获得更多详细信息,请访问 "Wayland项目主页&quot;:http://wayland.freedesktop.org/

从哪里找到QtWayland代码?

"Gitorious仓库&quot;:http://qt.gitorious.org/qt/qtwayland

怎样构建QtWayland?

桌面构建指令

设置构建环境

第一步,选择一个合适的新的Linux发行版。我使用Ubuntu 12.04,比这个新的更好。

下面的指南基于 http://wayland.freedesktop.org/building.html 上的提示

我做的第一件事是创建一个Wayland安装目录和一个设置环境的文件:

/Apps/Wayland/wayland.sourceme


#wayland.sourceme<br />WLD=$HOME/Apps/Wayland # change this to another location if you prefer<br />LD_LIBRARY_PATH=$WLD/lib<br />PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/<br />ACLOCAL=&quot;aclocal -I $WLD/share/aclocal&amp;quot;<br />PATH=$WLD/bin:$PATH<br />XDG_RUNTIME_DIR=/tmp
<br />export WLD LD_LIBRARY_PATH PKG_CONFIG_PATH ACLOCAL PATH XDG_RUNTIME_DIR


之后用这个文件设置您的工作环境:
_source/Apps/Wayland/wayland.sourceme_

编译依赖的库

您需要的大部分依赖库都已经发布了。但是仍然没有包含在最新的Linux发行版中。所以您需要编译它们。这里是编译它们的指南:

wayland

git clone git://anongit.freedesktop.org/wayland/wayland<br />cd wayland<br />git checkout -b branch-1.0.3 1.0.3<br />#this prevents autogen.sh to fail while testing for exiting folders<br />mkdir -p $WLD/share/aclocal<br />./autogen.sh —prefix=$WLD<br />make<br />make install

drm

git clone git://anongit.freedesktop.org/git/mesa/drm<br />cd drm<br />git checkout -b branch-2.4.40 2.4.40<br />./autogen.sh —prefix=$WLD<br />make &amp;&amp; make install

mesa

git clone git://anongit.freedesktop.org/mesa/mesa<br />cd mesa<br />git checkout 9.0<br />./autogen.sh —prefix=$WLD —enable-gles2 —disable-gallium-egl —with-egl-platforms=x11,wayland,drm —enable-gbm —enable-shared-glapi —with-gallium-drivers=r300,r600,swrast,nouveau<br />make &amp;&amp; make install

libxkbcommon

git clone git://people.freedesktop.org/xorg/lib/libxkbcommon.git<br />cd libxkbcommon/<br />git checkout -b branch-0.2.0 xkbcommon-0.2.0<br />./autogen.sh —prefix=$WLD —with-xkb-config-root=/usr/share/X11/xkb<br />make &amp;&amp; make install

weston(可选)

git clone git://anongit.freedesktop.org/wayland/weston<br />cd weston<br />git checkout -b branch-1.0.3 1.0.3<br />./autogen.sh —prefix=$WLD<br />make<br />make install -k

Qt 5.0.0依赖

对于Qt,您可以使用于预编译的5.0.0二进制文件,或者从最新的Qt 5.0.0(stable分支)构建,这里不使用wayland.source环境。您至少需要的Qt 5.0.0模块有:
qtbase
qtjsbackend
qtdeclarative

如果您遇到了关于libGL和undefined references链接错误,可能是需要编译Qt5并且链接自己编译的mesa库,可能是由于编译和安装mesa的方式,配置脚本需要明确的定义openGL的版本,使用: ./configure -opengl es2

构建QtWayland模块

一旦您构建好了Qt 5,之后获取最新的QtWayland模块代码,使用qmake配置,这次是用wanyland.source环境。确定您使用的qmake是刚构建好的Qt 5中的。这将确定您使用了特别的OpenGL和Wayland版本来构建Wayland平台插件和QtCompositor API。

source <sub>/Apps/Wayland/wayland.sourceme<br />git clone git://gitorious.org/qt/qtwayland.git<br />cd qtwayland<br />qmake<br />make<br />make install


h2. Raspberry Pi编译指南
敬请期待。


h1. 怎样使用QtWayland?
h2. 作为Wayland客户端运行Qt程序
当您编译完QtWayland模块,您将得到一个新的wayland平台插件。要使用它,您首先需要有一个已经运行的Wayland compositor。这可以是一个Wayland项目提供的Weston reference compositor,或是QtWayland提供的Qt example compositor。不管怎样,作为一个应用程序开发者,您需要做的唯一一件事是把您的程序作为wayland客户端运行:


source</sub>/Apps/Wayland/wayland.sourceme<br />./application -platform wayland

创建和运行您自己的Qt5 Wayland Compositor

运行例子中的compositor

QtWayland模块中提供了几个compositor样例,演示了QtCompositor是如何工作的。这些样例在QtWayland模块的example目录中,如果您使用qmake时添加了&quot;wayland-compositor&quot;到CONFIG变量。

qmake CONFIG+=wayland-compositor<code>

这些例子示范了服务器端(server side)的Wayland所以您不需要使用wayland平台插件不管您是在那个平台运行通常这些平台是eglfs kms或者您想运行于X11 xcb

如果您想在X11中运行qml-compositor: 您需要按下面的方式运行

source ~/Apps/Wayland/wayland.sourceme
cd qtwayland/examples/qml-compositor
./qml-compositor -platform xcb

现在,您的Wayland compositor运行了,您可以连接和显示Wayland客户端了。

创建您自己的compositor

创建Wayland compositor和控制相关事件的应用程序接口在QtWayland类的WaylandCompositor中。它的构造函数需要QWindow对象指针作为主参数。这使实现compositor更加灵活。

由于这种设计,实现compositor有3中不同的方法:

  • 基于QWidow:实例将会用于配置WaylandCompositor对象。
  • 基于QWidget:这种情况中,基础的widget窗体句柄将被使用。
  • 基于QML:您的C+程序将使用一个QQuickView对象类配置WaylandCompositor。直到些这篇文章的时候,还没有仅使用QML创建compositor的方法。


WaylandCompositor是纯抽象虚类,它不能用来创建实例。实现compositor的通用方法是继承自WaylandCompositor并实现这个方法*void surfaceCreated(WaylandSurface surface)
这个方法会在每次新客户端连接的时候执行(例如程序启动请求compositor服务时)。作为一个WaylandSurface对象。这里有一些这个对象生成的信号,被compositor处理,叫做:


* mapped(): 当client连接到compositor时发射。
* damaged(): TODO
* destroyed(): 当client退出时发射(即应用程序退出时)
* unmapped(): TODO
* extendedSurfaceReady(): TODO
工程文件需要使用compositor模块(即在.pro文件中添加QT= compositor)。有趣的是在写这篇文章的时候,需要注意的是有些QML相关的API只能在工程文件中添加宏定义(即DEFINES += QT_COMPOSITOR_QUICK)。

独立运行compositor

TODO