小编Xan*_*ndZ的帖子

PyQt:试图理解图形场景/视图

我正在尝试理解QGraphicsView和QGraphicsScene,特别是如何放置图形项目并将它们显示在我想要的位置.如果场景大于观看区域,我也会在滚动条出现时感到困惑.

例如,这段代码将在顶角创建一个带有椭圆的小图形视图:

import sys
from PyQt4 import QtGui, QtCore

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))

        self.setScene(self.scene)

        self.item = QtGui.QGraphicsEllipseItem(0, 0, 60, 40)
        self.scene.addItem(self.item)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = MyView()
    view.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

但是,如果self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))省略,则即使椭圆具有x,y = 0,0,椭圆也会出现在窗口的中间.我不知道为什么!这种行为有原因吗?

同样,当场景大小大于视图时,我对滚动条的外观感到困惑.例如,以下代码创建一个带有多个椭圆的视图/场景,并且itemsBoundingRect大于sceneRect.仅显示了一些省略号,但没有滚动条可以看到隐藏的省略号,您必须增加窗口的大小.但是当你这样做时,椭圆的位置会发生偏移,因此忽略椭圆的x,y.

import sys
from PyQt4 import QtGui, QtCore

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.setGeometry(QtCore.QRect(100, 100, 250, 250))

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))

        self.setScene(self.scene)

        for i …
Run Code Online (Sandbox Code Playgroud)

python pyqt4 qgraphicsview qgraphicsscene

11
推荐指数
1
解决办法
2万
查看次数

PyQt QTcpServer:如何将数据返回到多个客户端?

我期待使用PyQt创建一个QTcpServer,它可以同时将数据返回给两个或更多客户端.我认为这需要线程化.

使用threadedfortuneserver.py示例作为测试用例(包含在PyQt4中,在我的系统上,它位于/ usr/share/doc/python-qt4-doc/examples/network中),我想连接多个客户端,每次都需要一个客户要求发财,其他客户也会更新一条消息,例如"客户X刚刚收到财产'等等等等等等."

我理解fortuneserver/client程序是如何工作的,但似乎在将财富发送回客户端后立即终止客户端连接.我的具体问题是:

  1. 是否可以保持所有连接处于打开状态,以便每当其中一个客户端请求发财时,其他客户端都可以更新?

  2. 如果是这样,跟踪和循环连接的客户端的最佳方法是什么?

这对我来说是一个严重的绊脚石,因为我想开发一个应用程序,其中几个客户端可以进行交互,并且每个客户端都可以更新其他客户端的操作.

在此先感谢您的帮助,如果我能提供任何其他信息,请与我们联系.

我找到了这个帖子,但没有足够的具体信息可供使用.关于Python套接字包的其他讨论,但我的理解是,当使用PyQt时,服务器应该是QTcpServer,所以一切都很好.

***编辑***

以下是我的解决方案的开始阶段.我创建了一个基本的服务器和客户端.服务器只是将客户输入的内容发送回"行编辑"框.

我基于使用Python和QtRapid GUI Programming的第18章中的"buildingservices"示例.

我做的主要改变是现在线程无限期地运行并且它们的套接字保持打开状态,监听客户端发送的数据.

它处理多个客户端很好.这当然很难看,但我认为这是一个很好的起点.

我想要的是能够在一个客户端输入文本时通知每个客户端(比如典型的聊天程序).

另外,为了让您了解自己与谁打交道,我不是专业程序员.我是一名物理学家,拥有多年无纪律的脚本和摆弄我的腰带.但我想尝试开发可以传递数据的基本服务器/客户端程序.

感谢您的任何帮助或建议!

服务器:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtNetwork import *

PORT = 9999
SIZEOF_UINT16 = 2

class Thread(QThread):

    #lock = QReadWriteLock()

    def __init__(self, socketId, parent):
        super(Thread, self).__init__(parent)
        self.socketId = socketId

    def run(self):
        self.socket = QTcpSocket()

        if not self.socket.setSocketDescriptor(self.socketId):
            self.emit(SIGNAL("error(int)"), socket.error())
            return

        while self.socket.state() == QAbstractSocket.ConnectedState:
            nextBlockSize = 0
            stream = …
Run Code Online (Sandbox Code Playgroud)

python pyqt4 qtcpsocket qtcpserver

5
推荐指数
1
解决办法
7715
查看次数