我尝试用asyncore做简单的异步http客户端:这段代码工作正常,输出是(快速执行):
www.gmail.com : recv http code: 301
www.yandex.ru : recv http code: 200
www.python.org : recv http code: 200
www.google.ru : recv http code: 200
www.gravatar.com : recv http code: 302
www.com.com : recv http code: 302
www.yahoo.com : recv http code: 302
www.bom.com : recv http code: 301
Run Code Online (Sandbox Code Playgroud)
但是,与我不存在主机的取消注释:
#c = AsyncHTTP('http://www.no-such-host.ru') #!this line breaks execution!
Run Code Online (Sandbox Code Playgroud)
执行中断,代码挂起一段时间,输出部分数据并挂起,没有最后的数据输出:
connection error: [Errno -5] No address associated with hostname
www.gmail.com : recv http code: 301
www.yandex.ru : recv http code: 200
www.yahoo.com …Run Code Online (Sandbox Code Playgroud) 如何创建下拉窗口小部件,例如下拉式QLabel,下拉式QTextBrowser等?
例如,我在QTextBrowser中记录信息,但我不希望它占用屏幕上的空间.所以我想能够点击QTool按钮并有一个可滚动的QTextBrowser下拉菜单.(QComboBox也可以工作,但我不能只将每个事件作为一个单独的项添加 - 我需要包装文本,而不是被省略.因此,下拉QTextBrowser.)
或者,例如,我想要一个包含图片的下拉QLabel等...
我在 Qt Designer 中创建了一个 UI 并将其转换为 python:

在空白区域中,我添加了一个滚动区域和一个网格布局来对齐我的按钮。
每次按下“CreatePose”按钮时,我都需要从左上角开始向 gridlayout 添加一个带有图标的按钮。现在它将它添加到网格布局的中心。
self.ui.PoseBtn_GridLayout.setColumnMinimumWidth(4,4)
self.button = QtGui.QPushButton('')
self.button.setIcon(self._icon)
self.button.setIconSize(QtCore.QSize(128, 128))
self.button.setMinimumSize(QtCore.QSize(128, 128))
self.button.setMaximumSize(QtCore.QSize(128, 128))
self.ui.PoseBtn_GridLayout.addWidget(self.button)
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
我正在尝试绘制 QGraphicScene 数据,该数据可能会根据情况而变化几个数量级。由于我使用的笔是装饰性的,因此我希望视图与数据的大小无关。但我得到的是这样的:
带噪声的正弦波乘以 50000:

带噪声的正弦波乘以 50:

但是,如果我放大这些图中的任何一个(两个图的缩放量相同),我最终会达到两个图像看起来相同的水平:

这里发生了什么?为什么数据值变大了,笔的宽度就变了?为什么放大后缩放比例消失了?
重现此内容的代码如下。左键单击图可放大,右键单击可缩小。
import sys
from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC
import numpy as n
class ZoomView(QG.QGraphicsView):
"""Zoomable QGraphicsView"""
def mouseReleaseEvent(self,event):
if event.button() == QC.Qt.LeftButton:
self.scale(1.5,1)
elif event.button() == QC.Qt.RightButton:
self.scale(1/1.5,1)
class MainUI(QG.QDialog):
def __init__(self, parent=None):
super(MainUI, self).__init__(parent)
layout = QG.QVBoxLayout()
self.setLayout(layout)
button_layout = QG.QHBoxLayout()
pb3 = QG.QPushButton('add plot')
button_layout.addWidget(pb3)
layout.addLayout(button_layout)
pb3.clicked.connect(self.scene_maker_singleshot)
scene = QG.QGraphicsScene()
view = ZoomView(self)
view.setTransformationAnchor(QG.QGraphicsView.AnchorUnderMouse)
view.setRenderHint(QG.QPainter.Antialiasing)
layout.addWidget(view)
view.setScene(scene)
self.view = view
self.scene = …Run Code Online (Sandbox Code Playgroud) 我有一个QWidget,里面有一个QTableView.我需要在表的第一列有一个查找功能,所以当我点击Ctrl + F时,会弹出一个查找对话框.
class Widget(QWidget):
def __init__(self,md,parent=None):
QWidget.__init__(self,parent)
layout=QVBoxLayout(self)
# initially construct the visible table
tv = QTableView()
# uncomment this if the last column shall cover the rest
tv.horizontalHeader().setStretchLastSection(True)
tv.show()
# set black grid lines
self.setStyleSheet("gridline-color: rgb(39, 42, 49)")
# construct the Qt model belonging to the visible table
model = NvmQtModel(md)
tv.setModel(model)
tv.resizeRowsToContents()
tv.resizeColumnsToContents()
# set the shortcut ctrl+F for find in menu
shortcut = QShortcut(QKeySequence('Ctrl+f'), self)
shortcut.activated.connect(self.handleFind)
# delegate for decimal
delegate = NvmDelegate()
tv.setItemDelegate(delegate)
self.setGeometry(200,200,600,600) # …Run Code Online (Sandbox Code Playgroud) 我做了多选QComboBox.项目是可检查的(每个项目都有复选框和文本值).只有在用户单击它时才会检查CheckBox.我想要的是在用户点击文本值时捕获信号,这样我就可以设置选中它旁边的复选框.怎么做?

这就是我将模型设置为组合框的方式:
areas = ["Area one", "Area two", "Area three", "Area four"]
model = QtGui.QStandardItemModel(5, 1)# 5 rows, 1 col
firstItem = QtGui.QStandardItem("---- Select area(s) ----")
firstItem.setBackground(QtGui.QBrush(QtGui.QColor(200, 200, 200)))
firstItem.setSelectable(False)
model.setItem(0, 0, firstItem)
for i,area in enumerate(areas):
item = QtGui.QStandardItem(area)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setData(QtCore.Qt.Unchecked, QtCore.Qt.CheckStateRole)
model.setItem(i+1, 0, item)
self.ui.comboBox.setModel(model)
self.ui.comboBox.installEventFilter(self)
Run Code Online (Sandbox Code Playgroud)
我已经为阻止轮子事件添加了事件过滤器,因此firstItem文本总是显示为"已选择"
def eventFilter(self,target,event):
if target == self.ui.comboBox:
if(event.type()== QtCore.QEvent.Wheel):
#wheel event is blocked here
return True
return False
Run Code Online (Sandbox Code Playgroud) 我正在使用Qt的QWebPage来呈现一个使用javascript动态更新其内容的页面 - 因此只下载静态版本的页面(例如urllib2)的库将无效.
我的问题是,当我渲染第二页时,大约99%的时间程序崩溃了.在其他时候,它会在崩溃前工作三次.我也得到了一些段错误,但它都是随机的.
我的猜测是我用来渲染的对象没有被正确删除,所以尝试重用它可能会给自己造成一些问题.我看了一遍,似乎没有人真的遇到同样的问题.
这是我正在使用的代码.该程序从steam的社区市场下载网页,因此我可以创建所有项目的数据库.我需要getItemsFromPage多次调用该函数来获取所有项目,因为它们被分解为页面(显示X量的结果1-10).
import csv
import re
import sys
from string import replace
from bs4 import BeautifulSoup
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
class Item:
__slots__ = ("name", "count", "price", "game")
def __repr__(self):
return self.name + "(" + str(self.count) + ")"
def __str__(self):
return self.name + ", " + str(self.count) + ", $" + str(self.price)
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def _loadFinished(self, …Run Code Online (Sandbox Code Playgroud) 如果我打开一个 Python 解释器并输入以下几行:
from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
Run Code Online (Sandbox Code Playgroud)
然后出现一个文本输入小部件。当我与口译员互动时,我可以与它互动。如果我附加了任何事件处理程序,它们也会被调用。
如果我这样做import time; time.sleep(10),小部件将无响应 10 秒。
如果我运行app.exec_(),该调用会阻塞,直到我关闭应用程序。
我的问题是:app.exec_()如果小部件已经在响应事件,那么运行的意义何在?有什么不同吗?这是否只是一种防止应用程序关闭同时仍为 Qt 的事件循环提供服务的方法(while True: pass正如我们所理解的那样,会导致事件循环阻塞time.sleep(10))
我还想了解 Qt 在哪里与 CPython 挂钩,允许解释器和 GUI 处于活动状态。我知道 Python 2(可能还有 3?)有一个所谓的PyOS_InputHook机制,大约每秒调用 10 次。IPython 使用它来运行 GUI(需要付出很多努力以每秒 10 次以上的速度处理 GUI 事件)。当我实例化 a 时是否发生了同样的事情QApplication?如果是这样,再一次,打电话有什么意义app.exec_()
我正试图找到一种方法来正确退出我的应用程序.当我退出时,我收到一个错误说QThread: Destroyed while thread is still running.我有一个线程用于输出输出到QTextBrowser.什么应该是正确的退出方式?这是我得到的:
class LogReceiver(QtCore.QObject):
mysignal = QtCore.Signal(str)
def __init__(self, queue, *args, **kwargs):
QtCore.QObject.__init__(self, *args, **kwargs)
self.queue = queue
def run(self):
while True:
text = self.queue.get()
self.mysignal.emit(text)
if __name__ == '__main__':
queue = Queue()
thread = QtCore.QThread()
my_receiver = MyReceiver(queue)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
my_receiver.mysignal.connect(window.append_text)
my_receiver.moveToThread(thread)
thread.started.connect(my_receiver.run)
thread.start()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
thread退出时应该以某种方式终止?请注意self.queue.get()块和等待文本.
谢谢
我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程。qt 何时创建作为参数传递的对象的副本。根据:http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/ qt 应该复制该对象。但是,在下面的示例中,主线程可以更改从另一个线程发送的列表的内容。
import sys
import time
from PyQt5.QtCore import QThread, QObject, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QApplication
class ClassProcessing(QObject):
py_sig_send_data = pyqtSignal(list)
def __init__(self):
super().__init__()
# initialize some variables
self.data = [1, 2, 3, 4, 5]
def worker(self):
print(self.data)
self.py_sig_send_data.emit(self.data)
time.sleep(1)
print("modfied data in thread", self.data)
class ClassProcessingThread(QObject):
def __init__(self):
super().__init__()
self.objThread = QThread()
self.objThread_id = 1
self.objThread_finished = False
self.processing = ClassProcessing()
self.processing.moveToThread(self.objThread)
self.objThread.started.connect(self.processing.worker)
self.objThread.start()
class SomeClass(QObject):
def __init__(self):
super().__init__()
@pyqtSlot(list)
def …Run Code Online (Sandbox Code Playgroud)