小编ekh*_*oro的帖子

pyqt:在pyqt中将多个信号连接到同一个函数的正确方法(QSignalMapper不适用)

  1. 我已经准备了很多关于如何在 python 和 pyqt 中将多个信号连接到同一个事件处理程序的帖子。例如,将多个按钮或组合框连接到同一功能。

  2. 许多示例展示了如何使用 QSignalMapper 执行此操作,但是当信号携带参数时不适用,例如 combobox.currentIndexChanged

  3. 许多人建议它可以用 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)

python garbage-collection pyqt signals-slots qsignalmapper

4
推荐指数
1
解决办法
3225
查看次数

如何识别应用程序在 Linux 上以深色主题运行?

我开发了一个使用 qscintilla 作为文本编辑器的应用程序。我还实现了自定义词法分析器来突出语言特定的关键字。到目前为止,突出显示关键字的样式在我的应用程序中是硬编码的,并且在 Windows/Linux(Ubuntu)/Mac 上的默认主题中看起来很不错。

当用户选择深色主题(在 Linux 上)时会出现问题。根据 QScintilla 版本,编辑器的某些部分确实反映了当前的主题颜色,而其他部分则没有。此外,我的自定义样式在深灰色背景上呈现深蓝色字母。

我正在寻找一些 Qt 类,这将允许我访问当前系统主题。我不想为我的应用程序小部件定义样式。我想知道什么是系统默认的非比例字体,它的大小、颜色是什么……如果我知道使用了深色方案,我会选择互补色来突出显示关键字。

我检查了 QStyle、QPlatformTheme 和其他 qt 类的文档,在我看来,它们更多地用于定义新样式,然后用于描述当前样式。

c++ qt themes qscintilla qt5

4
推荐指数
2
解决办法
1427
查看次数

单击项目视图的空白区域时清除选择

我用 制作了一个树结构QTreeWidget,效果很好。但我有一个问题。通常,对于树结构,如果我想取消选择所有,我单击树小部件的空白区域。但QTreeWidget似乎不支持(或者我不知道如何)。

子分类或其他方法可以解决问题吗?确定点击空白区域似乎是解决方案的关键,但我找不到信号或任何东西。

python pyqt selection qtreewidget qabstractitemview

3
推荐指数
1
解决办法
2815
查看次数

如何使QWebView/QWebPage默认为serif字体?

使用PyQt4,我创建一个QWebView,然后使用其setHtml()方法加载它.HTML在大多数方面都正确显示,但始终使用默认的sans-serif字体.

当外部浏览器(例如Firefox)加载相同的HTML纯文本时,它将以默认的serif字体显示.我希望webview也能这样做.

我已经阅读了QWebView,QWebPage和QWebSettings的文档,并且没有看到任何设置默认"标准"或"比例"字体的方法,与浏览器的首选项设置相比.我查看了QStyleSheets,但它们似乎不适用于QWebView/WebPage.

python fonts default pyqt qwebkit

3
推荐指数
1
解决办法
3959
查看次数

同时删除小部件和布局

我试图找到一些需要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)

python layout pyqt pyqt4

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

如何对QtTreeView上的键盘选择做出反应?

QTreeViewclicked信号,但不itemChanged喜欢QTreeWidget.我必须使用,QTreeView因为它是"基于模型".但是,如果我的用户选择了一个带有keyborad的行,clicked则不会被发送,并且永远不会调用我的回调.我应该注册什么信号?

python pyqt signals-slots qtreeview pyside

3
推荐指数
1
解决办法
1079
查看次数

如何使用 ImageQt

我想使用 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)

测试.gif
(来源:www.sonic.net 上的 sjs

注意:在第一个建议之后添加了额外的 …

image pyqt4 python-imaging-library python-3.3

3
推荐指数
1
解决办法
5824
查看次数

如何在QHeaderView和QTableView之间注入小部件?

我想QHeaderView在其他部分之间显示小部件QTableView,如下面的示例图片(用Photoshop创建),因为这似乎是一种自然的方式来启用输入过滤列.


有没有人对如何在中间注入小部件有任何想法?


在此输入图像描述

python qt pyqt qtableview qheaderview

3
推荐指数
1
解决办法
1027
查看次数

PyQt5 QTimer 计数直到特定秒

我正在用 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)

python pyqt qtimer pyqt5

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

PyQt5 - 类型错误:信号有 0 个参数,但提供了 1 个参数

我正在尝试将“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 stdout signals-slots qtextedit pyqt5

3
推荐指数
1
解决办法
2666
查看次数