- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是,如何在服务器和正在运行的 QWidget 应用程序之间传递数据?例如,当在 MyServer 中调用 onNewConnection(self) 函数时,我想在 UI 中显示一个新标签,显示“客户端已连接”。
任何帮助将不胜感激!
我有以下使用 Qt Websocket 服务器的 PyQt5 应用程序的程序结构:
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QComboBox, QMainWindow, QPushButton, QVBoxLayout, QSystemTrayIcon, QStyle, QMenu, qApp, QAction
from PyQt5.QtGui import QIcon, QPixmap, QIcon, QFont
from PyQt5.QtCore import pyqtSlot, Qt, QObject, pyqtSignal
from PyQt5 import QtWebSockets, QtNetwork
import sys
class App(QWidget):
def __init__(self, *args, **kwargs):
super().__init__()
self.title = "Title window"
self.left = 0
self.top = 35
self.width = 550
self.height = 250
def init_ui(self):
# Initialise UI elements like buttons, labels, ...
class MyServer(QObject):
def __init__(self, parent):
super(QObject, self).__init__(parent)
self.clients = []
self.server = QtWebSockets.QWebSocketServer(parent.serverName(), parent.secureMode(), parent)
if self.server.listen(QtNetwork.QHostAddress.LocalHost, 8765):
print('Connected: '+self.server.serverName()+' : '+self.server.serverAddress().toString()+':'+str(self.server.serverPort()))
else:
print('error')
self.server.newConnection.connect(self.onNewConnection)
print(self.server.isListening())
def onNewConnection(self):
print("Connected")
#self.mySignal.emit("connected")
self.clientConnection = self.server.nextPendingConnection()
self.clientConnection.textMessageReceived.connect(self.processTextMessage)
self.clientConnection.binaryMessageReceived.connect(self.processBinaryMessage)
self.clientConnection.disconnected.connect(self.socketDisconnected)
self.clients.append(self.clientConnection)
def processTextMessage(self, message):
if (self.clientConnection):
self.clientConnection.sendTextMessage(message)
print(message)
def processBinaryMessage(self, message):
if (self.clientConnection):
self.clientConnection.sendBinaryMessage(message)
def socketDisconnected(self):
if (self.clientConnection):
self.clients.remove(self.clientConnection)
self.clientConnection.deleteLater()
app = QApplication(sys.argv)
ex = App()
serverObject = QtWebSockets.QWebSocketServer('My Socket', QtWebSockets.QWebSocketServer.NonSecureMode)
server = MyServer(serverObject)
serverObject.closed.connect(app.quit)
app.exec_()
最佳答案
Qt 推荐的最优雅的方法是使用信号和槽。
您的服务器也有一个错误,因为“clientConnection”指的是最后一个连接的套接字,因此如果它有n个“套接字”连接并且第一个接收信息,您将把它发送到最后一个似乎不正确的信息。最后你创建了QWebSocketServer,你只用它来存储名称和方式,这是没有意义的,而是最好将参数传递给构造函数
import sys
from PyQt5 import QtCore, QtWidgets, QtWebSockets, QtNetwork
class App(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.init_ui()
def init_ui(self):
self.status_label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.status_label)
@QtCore.pyqtSlot(str)
def on_status_changed(self, status):
self.status_label.setText(status)
class MyServer(QtCore.QObject):
statusChanged = QtCore.pyqtSignal(str)
def __init__(self, name, mode, parent=None):
super().__init__(parent)
self.clients = []
self.server = QtWebSockets.QWebSocketServer(name, mode, parent)
self.server.closed.connect(QtCore.QCoreApplication.quit)
if self.server.listen(QtNetwork.QHostAddress.LocalHost, 8765):
print(
"Connected: {} : {} : {}".format(
self.server.serverName(),
self.server.serverAddress().toString(),
self.server.serverPort(),
)
)
else:
print("error: {}".format(self.server.errorString()))
self.server.newConnection.connect(self.onNewConnection)
print(self.server.isListening())
@QtCore.pyqtSlot()
def onNewConnection(self):
client = self.server.nextPendingConnection()
client.identifier = QtCore.QUuid.createUuid().toString(QtCore.QUuid.Id128)
client.textMessageReceived.connect(self.processTextMessage)
client.binaryMessageReceived.connect(self.processBinaryMessage)
client.disconnected.connect(self.socketDisconnected)
self.clients.append(client)
self.statusChanged.emit("Connected: client-{}".format(client.identifier))
@QtCore.pyqtSlot(str)
def processTextMessage(self, message):
client = self.sender()
if isinstance(client, QtWebSockets.QWebSocket):
client.sendTextMessage(message)
print("Client-{}: {}".format(client.identifier, message))
@QtCore.pyqtSlot(QtCore.QByteArray)
def processBinaryMessage(self, message):
client = self.sender()
if isinstance(client, QtWebSockets.QWebSocket):
client.sendBinaryMessage(message)
print("Client-{}: {}".format(client.identifier, message))
@QtCore.pyqtSlot()
def socketDisconnected(self):
client = self.sender()
if isinstance(client, QtWebSockets.QWebSocket):
self.clients.remove(client)
self.statusChanged.emit("Disconnected: client-{}".format(client.identifier))
client.deleteLater()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ex = App()
ex.show()
server = MyServer("My Socket", QtWebSockets.QWebSocketServer.NonSecureMode)
server.statusChanged.connect(ex.on_status_changed)
sys.exit(app.exec_())
关于python - 如何在不同类的 Main Widget 和 QObject 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59157478/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在试验 jquery-ui 并查看和克隆一些示例。在一个示例(自动完成的组合框)中,我看到一个带有 ui-widget 类的 anchor (a) 元素,它与包含的 css 文件中的 .ui-wi
在我帮助维护的代码中,我发现了多个如下所示的代码示例: Description := IfThen(Assigned(Widget), Widget.Description, 'No Widget')
这个问题在这里已经有了答案: CSS Performance Question (8 个答案) 关闭 9 年前。 这是一个很常见的情况。假设我们有一些标记: 我们可以使用 2 个选项来
这个问题在这里已经有了答案: CSS: Class name selector- name starts with (2 个答案) 关闭 5 年前。
我有一个布局,其中Row小部件中有两个子部件,这两个都是灵活的小部件。左侧的小部件包含红色和蓝色的小部件,我希望根据右侧小部件的高度增加蓝色小部件的高度(这是一个灵活的小部件,其FLEX值为7)。。例
我有一个布局,其中Row小部件中有两个子部件,这两个都是灵活的小部件。左侧的小部件包含红色和蓝色的小部件,我希望根据右侧小部件的高度增加蓝色小部件的高度(这是一个灵活的小部件,其FLEX值为7)。。例
这是一个代码: import 'package:flutter/material.dart'; import 'package:flutterapp/ui/pages/notes_home.dart'
ListView、GridView、SingleChildScrollView 等小部件是可滚动的小部件,而Container、SizedBox, Column 不是。 有没有办法检查 Widget
假设我在 Python 中有这个简单的函数: def f(gender, name): if gender == 'male': return ranking_male(nam
我不想听起来像个糟糕的新手,但是小部件是独立的应用程序吗?例如,我正在为 Android 创建一个新闻阅读器应用程序,我想要一个主屏幕小部件。我是将小部件创建为 Hook 到其他应用程序的单独项目/应
如何告诉 Tk 小部件告诉我它的子级是什么(或谁,视情况而定)?有这个命令吗? 例如,给定一个带有标签、按钮和其他装饰的 Canvas 小部件 .cvs ...如何查询 Canvas ? 最佳答案 w
我为 Android 开发了一个 APP + 主屏幕小部件。现在我更新了应用程序(增加了版本代码/名称)但是当我安装时,它不会自动替换屏幕上现有的小部件。它只是说“问题加载小部件”。 有什么想法吗??
我是小部件开发的新手..我设法构建了一个无法调整大小的小部件..我希望它像 - 用户设法根据自己调整大小......有人可以告诉我如何制作它可能吗? 谢谢 friend 。 最佳答案 AppWidge
我有一个小部件列表: List widgetList = List(); widgetList.add(WidgetA()); widgetList.add(WidgetB()); widgetLis
对不起,我的英语不好! 我开发了一个今日小部件。我需要从小部件启动 map 应用程序(例如),并且在设备锁定时不工作。在这种情况下如何检测锁定的设备并启动解锁屏幕? 问候, 最佳答案 而不是使用 UI
我正在尝试制作我的小部件的免费版本,我想向小部件添加广告,这可能吗?如果是这样怎么办? 最佳答案 小部件应用程序中的 View 仅限于: 模拟时钟 按钮 天文台 图像按钮 ImageView 进度条
我在 Android Studio 中创建了一个新项目,然后添加了一个新的小部件并在我的 Nexus 5 5.1 上运行该应用程序,它可以工作,但是当尝试将小部件添加到主屏幕时,它没有出现在小部件列表
我有一个字符串 'currentMessage' 和一个用于显示它的标签。我有一个 Toplevel 小部件,其中包含一个文本小部件,为“currentMessage”提供新值: from tkint
我尝试使用这个 link 解决我的问题 update - I figured out that there is something wrong with the setter of the pend
我是一名优秀的程序员,十分优秀!