PyQt中的QML,为什么不能如示例中那样没有边框?以及和PyQt相关问题

193 views
Skip to first unread message

cnkiller

unread,
Jul 14, 2011, 3:29:24 AM7/14/11
to python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
hi,all

刚刚学习了python,确实很简单。而且还有另一个好处,逼迫你学习英语,因为很多问题都是英文回答的,要看懂才能解决啊。接着用PyQt做了一个小
程序练手。在此中有以下几个问题,特来咨询一下:

1、qml边框
在看Qt的示例时,看到了了qml,确实很惊艳。于是想用这个做界面。杯具的是用上例子的代码后,显示的效果却不是那样的,例子是没有边框,关闭按钮
等。但实际使用时,却有这些东西,完全把qml的优点覆盖了。

怎么样操作才能如它的示例中那样优美了?

2、qml中的py代码是加密的
这个是咋做到的,都是Xqw/X12/X1w这样的代码,搜索后没找到这个加密是咋弄的,不知道有人知道吗?

3、减少生成程序的大小
我练手的程序,不超过200行的文件,用的是cxfreeze打包,结果生成出的文件20M。里面都是dll的文件,我以为少import一些东西可以
减少大小,特地去改了程序,结果还是一样的20M。搜索也没找到好的方法,也是来请教的。

MuSheng Chen

unread,
Jul 14, 2011, 3:45:07 AM7/14/11
to pyth...@googlegroups.com
1.2.兩點沒代碼沒真相。
第3點,打包後需要包含相應的dll,pyd是必然的,如果想減少體積只能從dll,pyd入手,但也減不了多少。
py2exe的話倒有兩個參考,cxfreeze沒用過
http://www.py2exe.org/index.cgi/BetterCompression
http://www.py2exe.org/index.cgi/OptimizingSize

2011/7/14 cnkiller <cnki...@gmail.com>

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug
       http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

ubunoon

unread,
Jul 14, 2011, 3:45:47 AM7/14/11
to pyth...@googlegroups.com
没有在pyQt上使用过qml,在qtCreator上使用qml,使用的是qmlview.exe来解释执行的。qml确实是一个震撼的东西。
至于你打包有那么大,很正常。

1、你需要python解释器以及相关的库,大概几兆
2、你需要Qt的库,至少两个QtCore.dll,QtGui.dll,也有10来兆
3、Python下使用Qt还有一些中间的库
4、你的qml也需要解释器的。

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug
       http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

Rujia Liu

unread,
Jul 14, 2011, 3:49:40 AM7/14/11
to pyth...@googlegroups.com
我用的PySide而非PyQt,QML正常(打包发布到其他机器运行也没问题)。贴一下你的代码和想要的效果(截图?)吧

打包的话,py2exe和pyinstaller都可以压缩,但要牺牲启动时间,而且也只是一定程度的压缩。cxfreeze没用过

2011/7/14 cnkiller <cnki...@gmail.com>:

Leo Jay

unread,
Jul 14, 2011, 4:54:31 AM7/14/11
to pyth...@googlegroups.com
2011/7/14 cnkiller <cnki...@gmail.com>:

1,2不了解。
第3点,你打包的程序总是要做安装包的吧。在用NSIS的时候,选LZMA最大压缩,我记得应该在10M以下的。

--
Best Regards,
Leo Jay

cnkiller

unread,
Jul 15, 2011, 1:38:16 AM7/15/11
to pyth...@googlegroups.com
1、示例图是这样的:



我运行的是这样的:

就是这个边框。

2、加密代码如下:
from PyQt4 import QtCore

qt_resource_data = "\
\x00\x00\x0a\x15\
\x00\
\x00\x38\x1d\x78\x9c\xdd\x5b\x5b\x73\xdb\xb8\x15\x7e\xcf\xaf\xc0\
\xb0\xd3\xc9\x43\x2d\x59\xb6\xb3\xd9\x8d\x6c\x79\x26\x63\x27\xbb\
\x99\x49\x9b\xcd\x46\x99\x9d\xf6\x0d\x02\x21\x11\x6b\x90\xa0\x01\
3、 我做的是绿色运行版,非安装包,但这句提醒了我。因为我20M的rar压缩后就是5M了。太厉害了。
谢谢leo jay

cnkiller

unread,
Jul 15, 2011, 1:41:42 AM7/15/11
to pyth...@googlegroups.com
1、示例图是这样的:
y.jpg

我运行的是这样的:
new.jpg
刚刚好像图没上来。再发一次,对不住各位用gmail的童鞋了。
new.jpg
y.jpg

Jimmy Kuu

unread,
Jul 15, 2011, 2:24:30 AM7/15/11
to pyth...@googlegroups.com
1. 最好有代码

2. 这不是加密代码,是Qt的资源文件转换成了py代码
比如你可以创建一个文件来定义资源
# res.qrc
<RCC>
    <qresource prefix="/">
        <file>images/new.png</file>
    </qresource>
</RCC>

然后使用命令
pyrcc4 -o res.py res.qrc

这样生成的res.py文件就和你看到的文件类似

再代码中通过
import res
导入资源文件

比如icon = QtGui.QIcon(':/images/new.png')就可以使用这个图形了

如果你直接使用文件的话必须使用icon = QtGui.QIcon('images/new.png')

cnkiller

unread,
Jul 15, 2011, 3:17:22 AM7/15/11
to pyth...@googlegroups.com
感谢你的答复。我的第二个问题解决了。谢谢。

对于第一个问题的代码,是从网上抄的一个是这样的:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)

web = QWebView()
web.load(QUrl('dialcontrol.qml'))
web.show()

sys.exit(app.exec_())

和示例中显示的效果是不一样的,示例是没有边框。而且示例下面的文件,有的就是一个qml和一个图片文件夹。所以想不明白为什么示例中没有边框。呵呵

MuSheng Chen

unread,
Jul 15, 2011, 3:48:25 AM7/15/11
to pyth...@googlegroups.com
具體要看dialcontrol.qml內容。


2011/7/15 cnkiller <cnki...@gmail.com>

Marco

unread,
Jul 15, 2011, 5:00:34 AM7/15/11
to pyth...@googlegroups.com
qml这么高级的东西还没用过, 不过如果是常规的可以加个hint

self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)

====
顺便搭车问下, hint这个词怎么翻译的?


2011/7/15 MuSheng Chen <sheng...@gmail.com>



--
LinuX
Violin
Canon EOS

Kermit

unread,
Jul 15, 2011, 5:07:58 AM7/15/11
to pyth...@googlegroups.com
On Fri, Jul 15, 2011 at 05:00:34PM +0800, Marco wrote:
> qml这么高级的东西还没用过, 不过如果是常规的可以加个hint

羡慕那些使用View和Qml的兄弟们,我悲催啊,换了两家公司了,为什么
Qtopia4.2.1总是跟我过不去……,神呐,给俺个4.5+的Qt-embedded吧!

> self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
>
> ====
> 顺便搭车问下, hint这个词怎么翻译的?

“提示”?


B.R
Kermit

cnkiller

unread,
Jul 15, 2011, 5:14:42 AM7/15/11
to python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
dialcontrol.qml的代码就是示例中的代码,一个字都没有变。哈


//! [imports]
import Qt 4.7
import "content"
//! [imports]

//! [0]
Rectangle {
color: "#545454"
width: 300; height: 300

// Dial with a slider to adjust it
Dial {
id: dial
anchors.centerIn: parent
value: slider.x * 100 / (container.width - 34)
}

Rectangle {
id: container
anchors { bottom: parent.bottom; left: parent.left
right: parent.right; leftMargin: 20; rightMargin: 20
bottomMargin: 10
}
height: 16

radius: 8
opacity: 0.7
smooth: true
gradient: Gradient {
GradientStop { position: 0.0; color: "gray" }
GradientStop { position: 1.0; color: "white" }
}

Rectangle {
id: slider
x: 1; y: 1; width: 30; height: 14
radius: 6
smooth: true
gradient: Gradient {
GradientStop { position: 0.0; color: "#424242" }
GradientStop { position: 1.0; color: "black" }
}

MouseArea {
anchors.fill: parent
drag.target: parent; drag.axis: Drag.XAxis
drag.minimumX: 2; drag.maximumX: container.width - 32
}
}
}
}
//! [0]


On Jul 15, 3:48 pm, MuSheng Chen <sheng.2...@gmail.com> wrote:
> 具體要看dialcontrol.qml內容。
>
> 2011/7/15 cnkiller <cnkil...@gmail.com>
>
>
>
>
>
>
>
> > 感谢你的答复。我的第二个问题解决了。谢谢。
>
> > 对于第一个问题的代码,是从网上抄的一个是这样的:
> > import sys
> > from PyQt4.QtCore import *
> > from PyQt4.QtGui import *
> > from PyQt4.QtWebKit import *
>
> > app = QApplication(sys.argv)
>
> > web = QWebView()
> > web.load(QUrl('dialcontrol.qml'))
> > web.show()
>
> > sys.exit(app.exec_())
>
> > 和示例中显示的效果是不一样的,示例是没有边框。而且示例下面的文件,有的就是一个qml和一个图片文件夹。所以想不明白为什么示例中没有边框。呵呵
>
> > --
> > 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> > 发言: pyth...@googlegroups.com
> > 退订: python-cn+...@googlegroups.com (向此发空信即退!)
> > 详情:http://code.google.com/p/cpyug/wiki/PythonCn
> > 严正: 理解列表! 智慧提问!http://wiki.woodpecker.org.cn/moin/AskForHelp

ubunoon

unread,
Jul 15, 2011, 3:19:00 PM7/15/11
to pyth...@googlegroups.com
你把qml放到手机上去运行,估计就没有边框了。

严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp

强烈: 建议使用技巧: 如何有效地报告Bug
       http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

jamiesun

unread,
Jul 16, 2011, 10:21:52 PM7/16/11
to pyth...@googlegroups.com
一般来说,你用一个主程序来加载qml,外层还是一个widget,你需要去改变widget的属性,去掉标题栏边框等东西,然后你在qml里去画标题栏,去处理拖拽,关闭等功能,这是qt基本的东西,用pyqt,pyside,qt c++都是一样的.

所谓代码加密,实际上是资源文件的二进制形式,是qt资源组织功能的一个特性.


在手机上运行的qml(qtquick)应用,一般是全屏显示的,所以你看不到边框等,如果你使用非全屏方式,手机本身的导航栏和底部工具栏还是一样显示.下图就是一个手机上运行qml的图.所有元件都是自己画的,就和photoshop画图一样.


5441386420_390096953a_z.jpg


qml 的集成javascript脚本功能非常强大,如果你的大多数功能用js都可以解决的,其实你不一定要去用python了.用qt  c++写一个主程序加载qml就行了,qml等脚本可以全部放入资源文件,然后转换成二进制形式,,js脚本也能被保护了.,最后用qmake make直接动态编译出来,拷贝仅仅需要的dll文件就OK了.




关注互联网,关注移动平台,关注软件技术,订阅我的微杂志《移动互联》

cnkiller

unread,
Jul 17, 2011, 7:16:00 AM7/17/11
to python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
非常感谢你的答复。
看来我开始的理解是错的。我的想法是把qml做成桌面程序的界面。看到你和之前的答复,我看qml主要是为手机服务的。设计的初衷就不是我想的。
谢谢。

On Jul 17, 10:21 am, jamiesun <jamiesun....@gmail.com> wrote:
> 一般来说,你用一个主程序来加载qml,外层还是一个widget,你需要去改变widget的属性,去掉标题栏边框等东西,然后你在qml里去画标题栏,去处理拖拽,关闭等功能,这是qt基本的东西,用pyqt,pyside,qt
> c++都是一样的.
>
> 所谓代码加密,实际上是资源文件的二进制形式,是qt资源组织功能的一个特性.
>
> 在手机上运行的qml(qtquick)应用,一般是全屏显示的,所以你看不到边框等,如果你使用非全屏方式,手机本身的导航栏和底部工具栏还是一样显示.下图就是一个手机上运行qml的图.所有元件都是自己画的,就和photoshop画图一样.
>
> [image: 5441386420_390096953a_z.jpg]
>
> qml 的集成javascript脚本功能非常强大,如果你的大多数功能用js都可以解决的,其实你不一定要去用python了.用qt
> c++写一个主程序加载qml就行了,qml等脚本可以全部放入资源文件,然后转换成二进制形式,,js脚本也能被保护了.,最后用qmake
> make直接动态编译出来,拷贝仅仅需要的dll文件就OK了.
>

> 关注互联网,关注移动平台,关注软件技术,订阅我的微杂志*:*《移动互联》<http://o.sdo.com/dy.ext?o=TkRBd053PT0K%0A>


>
> 在 2011年7月16日 上午3:19,ubunoon <net...@gmail.com>写道:
>
>
>
>
>
>
>
> > 你把qml放到手机上去运行,估计就没有边框了。
>

> > To be pythoner
> > My blog:http://www.cnblogs.com/ubunoon/
> > 珍珠饰品:http://zjyuezz.cn.alibaba.com/
> > English blog:http://qtrstudio.com/blog
> > 粮食机械:http://qtrstudio.com/grainmachine/
>
> > --
> > 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> > 发言: pyth...@googlegroups.com
> > 退订: python-cn+...@googlegroups.com (向此发空信即退!)
> > 详情:http://code.google.com/p/cpyug/wiki/PythonCn

MuSheng Chen

unread,
Jul 17, 2011, 8:37:30 PM7/17/11
to pyth...@googlegroups.com
qml在一下版本的qt會完整支持pc,目前還是針對移動設備較好些,當然如果簡單的話應是可以的。


2011/7/17 cnkiller <cnki...@gmail.com>
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp

jamiesun

unread,
Jul 19, 2011, 5:44:47 AM7/19/11
to pyth...@googlegroups.com
用qml做桌面应用也可以的,qt提供了一些额外的桌面组件库,另外也有一些第三方组件库.不用这些组件的话,可以全部自己定义自己的组件.喜欢的话做一套自己的组件库.

不过qt本身提供的类css样式已经很不错了.可以做的很漂亮.在桌面应用上要比qml稍好.但在手机上,qss显示就不是很好.



严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
Reply all
Reply to author
Forward
0 new messages