我已经准备了很多关于如何在 python 和 pyqt 中将多个信号连接到同一个事件处理程序的帖子。例如,将多个按钮或组合框连接到同一功能。
许多示例展示了如何使用 QSignalMapper 执行此操作,但是当信号携带参数时不适用,例如 combobox.currentIndexChanged
许多人建议它可以用 lambda 来制作。这是一个干净漂亮的解决方案,我同意,但没有人提到 lambda 创建了一个闭包,其中包含一个引用 - 因此无法删除被引用的对象。你好内存泄漏!
证明:
from PyQt4 import QtGui, QtCore
class Widget(QtGui.QWidget):
def __init__(self):
super(Widget, self).__init__()
# create and set the layout
lay_main = QtGui.QHBoxLayout()
self.setLayout(lay_main)
# create two comboboxes and connect them to a single handler with lambda
combobox = QtGui.QComboBox()
combobox.addItems('Nol Adyn Dwa Tri'.split())
combobox.currentIndexChanged.connect(lambda ind: self.on_selected('1', ind))
lay_main.addWidget(combobox)
combobox = QtGui.QComboBox()
combobox.addItems('Nol Adyn Dwa Tri'.split())
combobox.currentIndexChanged.connect(lambda ind: self.on_selected('2', ind))
lay_main.addWidget(combobox)
# let the handler show …Run Code Online (Sandbox Code Playgroud) 我开发了一个使用 qscintilla 作为文本编辑器的应用程序。我还实现了自定义词法分析器来突出语言特定的关键字。到目前为止,突出显示关键字的样式在我的应用程序中是硬编码的,并且在 Windows/Linux(Ubuntu)/Mac 上的默认主题中看起来很不错。
当用户选择深色主题(在 Linux 上)时会出现问题。根据 QScintilla 版本,编辑器的某些部分确实反映了当前的主题颜色,而其他部分则没有。此外,我的自定义样式在深灰色背景上呈现深蓝色字母。
我正在寻找一些 Qt 类,这将允许我访问当前系统主题。我不想为我的应用程序小部件定义样式。我想知道什么是系统默认的非比例字体,它的大小、颜色是什么……如果我知道使用了深色方案,我会选择互补色来突出显示关键字。
我检查了 QStyle、QPlatformTheme 和其他 qt 类的文档,在我看来,它们更多地用于定义新样式,然后用于描述当前样式。
我用 制作了一个树结构QTreeWidget,效果很好。但我有一个问题。通常,对于树结构,如果我想取消选择所有,我单击树小部件的空白区域。但QTreeWidget似乎不支持(或者我不知道如何)。
子分类或其他方法可以解决问题吗?确定点击空白区域似乎是解决方案的关键,但我找不到信号或任何东西。
使用PyQt4,我创建一个QWebView,然后使用其setHtml()方法加载它.HTML在大多数方面都正确显示,但始终使用默认的sans-serif字体.
当外部浏览器(例如Firefox)加载相同的HTML纯文本时,它将以默认的serif字体显示.我希望webview也能这样做.
我已经阅读了QWebView,QWebPage和QWebSettings的文档,并且没有看到任何设置默认"标准"或"比例"字体的方法,与浏览器的首选项设置相比.我查看了QStyleSheets,但它们似乎不适用于QWebView/WebPage.
我试图找到一些需要qt布局并从中删除所有内容的东西.想象一下窗口是什么样的 - 我有:
QVBoxLayout
| ------QHboxLayout
|---------QWidget
| ------QHboxLayout
|---------QWidget
.........
Run Code Online (Sandbox Code Playgroud)
所以我需要一些东西,我可以递归地调用CLEAR AND DELETE来自我父母的所有东西QVBoxLayout.我尝试了这里提到的东西(清除pyqt布局中的所有小部件),但没有一个工作(无论如何都没有标记正确的答案).我的代码看起来像这样:
def clearLayout(self, layout):
for i in range(layout.count()):
if (type(layout.itemAt(i)) == QtGui.QHBoxLayout):
print "layout " + str(layout.itemAt(i))
self.clearLayout(layout.itemAt(i))
else:
print "widget" + str(layout.itemAt(i))
layout.itemAt(i).widget().close()
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误:
layout.itemAt(i).widget().close()
AttributeError: 'NoneType' object has no attribute 'close'
Run Code Online (Sandbox Code Playgroud)
=>编辑这种方法有效(但如果除了以下情况之外Layout没有HBoxLayout:
def clearLayout(self, layout):
layouts = []
for i in range(layout.count()):
if (type(layout.itemAt(i)) == QtGui.QHBoxLayout):
print "layout " + str(layout.itemAt(i))
self.clearLayout(layout.itemAt(i))
layouts.append(layout.itemAt(i))
else:
print "widget" + …Run Code Online (Sandbox Code Playgroud) QTreeView有clicked信号,但不itemChanged喜欢QTreeWidget.我必须使用,QTreeView因为它是"基于模型".但是,如果我的用户选择了一个带有keyborad的行,clicked则不会被发送,并且永远不会调用我的回调.我应该注册什么信号?
我想使用 ImageQT,因此我可以使用 Python 图像库 (PIL) 进行图像处理并使用 Qt4 呈现结果。我有一个简短的测试例程,它读取 using PIL.Image.open,使用 ImageQT 转换它并使用 QT 打开一个对话框。如果我只是使用 Qt 来读取图像,它就可以工作。我错过了什么?
#!/usr/bin/python3.3
import sys
from PIL import Image
from PIL.ImageQt import ImageQt
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QImage
app = QtGui.QApplication(sys.argv)
# added initialization after first suggestion below
QtGui.QImageReader.supportedImageFormats()
im = Image.open('test.gif')
image = ImageQt(im)
pixmap = QtGui.QPixmap(image)
# pixmap = QtGui.QPixmap('test.gif')
widget = QtGui.QWidget()
hbox = QtGui.QHBoxLayout(widget)
lbl = QtGui.QLabel(widget)
lbl.setPixmap(pixmap)
hbox.addWidget(lbl)
widget.setLayout(hbox)
widget.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

(来源:www.sonic.net 上的 sjs)
注意:在第一个建议之后添加了额外的 …
我想QHeaderView在其他部分之间显示小部件QTableView,如下面的示例图片(用Photoshop创建),因为这似乎是一种自然的方式来启用输入过滤列.
我正在用 python 创建一个程序,我正在使用 pyqt。我目前正在使用 QTimer,我想每秒钟打印一次“计时器工作”并在 5 秒后停止打印。这是我的代码:
timers = []
def thread_func():
print("Thread works")
timer = QtCore.QTimer()
timer.timeout.connect(timer_func)
timer.start(1000)
print(timer.remainingTime())
print(timer.isActive())
timers.append(timer)
def timer_func():
print("Timer works")
Run Code Online (Sandbox Code Playgroud) 我正在尝试将“sys.stdout”重定向到QTextEdit,这是我的代码:
class Communicate(QObject):
printText = pyqtSignal()
def write(self, text):
self.printText.emit(str(text))
class UI(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self)
...
self.textedit = QTextEdit(self)
self.textedit.setGeometry(400,20,220,300)
self.c = Communicate()
self.c.printText.connect(self.textedit.insertPlainText)
sys.stdout = self.c
if __name__ == "__main__":
...
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到了TypeError: Communicate.printText[] signal has 0 argument(s) but 1 provided. 但是当我试图不提供任何参数时self.printText.emit(),它说self.textedit.insertPlainText需要 1 个参数。我错过了什么?您的回答将不胜感激。
python ×8
pyqt ×7
pyqt4 ×2
pyqt5 ×2
qt ×2
c++ ×1
default ×1
fonts ×1
image ×1
layout ×1
pyside ×1
python-3.3 ×1
qheaderview ×1
qscintilla ×1
qt5 ×1
qtableview ×1
qtextedit ×1
qtimer ×1
qtreeview ×1
qtreewidget ×1
qwebkit ×1
selection ×1
stdout ×1
themes ×1