小编ekh*_*oro的帖子

@pyqtSignature() 和 @pyqtSlot() pyqt 装饰器有什么区别

我试图编写一个连接到不同 pyqt 信号的插槽。我仍然无法理解的是两个装饰器 @pyqtSignature() 和 @pyqtSlot() 之间的区别。

连接到从 QAbstractButton 继承的 QPushButton 的 pyqt 单击信号的示例,on_widgetName_signalName在使用 @pyqtSignature("") 时,我使用了以下语法:

@pyqtSignature("")
def on_bn_gpx_select_file_clicked(self):  
    """
    Run when QPushButton is pressed, or do something
    """
    pass
Run Code Online (Sandbox Code Playgroud)

现在使用 @pyqtSlot() 时

@pyqtSlot()
def on_bn_gpx_select_file_clicked(self):  
    """
    Run when QPushButton is pressed, or do something
    """
    pass
Run Code Online (Sandbox Code Playgroud)

我的问题是,这两个装饰器有什么区别,什么时候应该使用 @pyqtSignature 或 @pyqtSlot()

谢谢

python qt pyqt signals-slots pyqt4

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

PyQt:在 QStyledItemDelegate 中使用 QTextEdit 作为编辑器

我正在寻找在 QStyledItemDelegate 中使用多行文本编辑的干净方法。createEditor 的实现非常简单,返回一个 QTextEdit 实例

def createEditor(self, parent, option, index):
    return QtGui.QTextEdit("Some text")
Run Code Online (Sandbox Code Playgroud)

setModelData期望派生出一个 Edit WidgetQWidget作为参数而不是QTextEditsbase QScrollArea。Qt 文档还告诉我(至少在 PyQt 文档中)该setModelData函数尝试从 QWidget UserData 字段获取数据。但是,如果没有派生的编辑小部件,QWidget则无法设置数据。目前它抛出一个,因为它在编辑器上AttributeError找不到。text()

是否有一些行之有效的方法来使用非 QWidget 编辑器?或者我只是缺少一些小部件来做到这一点?

目前,我通过实例化 aQLineEdit并将其QTextEdit传递toPlainText()给 来快速解决了该问题setModelData。非常哈克!!我还可以使用鸭子类型并在派生类上实现一个text()方法QTextEdit。但这仍然不是一个好方法,不是吗?在 C++ 中有什么方法可以做到这一点?

python pyqt qitemdelegate qtextedit qstyleditemdelegate

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

在 QTableWidget 中使用 setCellWidget 对列进行排序

我正在尝试对包含进度条的列进行排序。我希望列按进度条值排序。任何帮助都感激不尽 在此处输入图片说明

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


class Example(QMainWindow):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        self.tablew = Table(self)
        self.setCentralWidget(self.tablew)

        self.setGeometry(300, 300, 300, 200)
        self.show()


class ProgressBar(QProgressBar):

    def __init__(self, value, parent=None):
        QProgressBar.__init__(self)
        self.setMinimum(1)
        self.setMaximum(5.0)
        self.setValue(value)
        self.setFormat('{0:.5f}'.format(value))
        style = ''' QProgressBar{max-height: 15px;text-align: center;}'''
        self.setStyleSheet(style)


class Table(QTableWidget):

    def __init__(self,   parent=None):
        QTableWidget.__init__(self)
        self.setColumnCount(2)
        self.setHorizontalHeaderLabels(['id', 'status'])
        header = self.horizontalHeader()
        header.setResizeMode(QHeaderView.Stretch)
        self.setSortingEnabled(True)
        self.loadData()
        #

    def loadData(self):
        #
        tableData = [[89, 4.8], [99, 3.9], [101, 2.6], [105, 4]]
        #
        self.setRowCount(len(tableData))
        #
        for …
Run Code Online (Sandbox Code Playgroud)

sorting pyqt pyqt4 qtablewidget python-2.7

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

在菜单中的图标和文本之间添加垂直分隔符

我有一个关于如何在菜单中的图标和文本之间添加分隔符的问题。如果您有任何想法,那将非常有帮助。这正是我需要做的:

预览.

从一个按钮,打开一个菜单并添加像图像中的分隔符。

python qt menu pyqt pyqt5

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

如何从主窗口打开子窗口

我的问题很难解释,但我尽力了。请在这方面帮助我。

我在 QtDesigner 中设计了一个 gui,并将 .ui 文件转换为 .py,例如 main_window.py。现在为了避免在 main_window.py 中进行更改,我为侦听器创建了另一个类。

class Main():    
    window = None
    app = None

    def __init__(self):
        self.launch()
        self.attach_listener()
        self.execute()

    ''' Launch GUI '''
    def launch(self):
        self.app = QtGui.QApplication(sys.argv)
        self.window = Ui_MainWindow()
        self.window.show()

    ''' Execute Window '''
    def execute(self):
        sys.exit(self.app.exec_())

    ''' Attach Listeners '''
    def attach_listener(self):
        self.window.add_button.clicked.connect(self.add_listener)
        self.window.delete_button.clicked.connect(self.delete_listener)
        self.window.update_button.clicked.connect(self.update_listener)
        self.window.connect(self.window.combo_box, QtCore.SIGNAL('activated(QString)'), self.logout_listener)
Run Code Online (Sandbox Code Playgroud)

我有另一个具有相同结构的 child_window.py,但由于 QApplication,我无法从这个窗口打开该窗口。我搜索了答案,但无法应用于我的代码。当类从 QtGui.QMainWindow 或 QtGui.QWidget 扩展时,这些答案是适用的,但我的情况不同。

python window pyqt childwindow

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

如何在布局中组合列(colspan 功能)

我有这个代码:

#!/usr/bin/env python3

from PyQt5.QtWidgets import *
import sys    

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        layout = QGridLayout()
        self.setLayout(layout)

        label_1 = QLabel("label 1")
        layout.addWidget(label_1, 0, 0)

        label_2 = QLabel("label 2")
        layout.addWidget(label_2, 0, 1)

        label_3 = QLabel("label 3")
        layout.addWidget(label_3, 1, 0)


app = QApplication(sys.argv)

screen = Window()
screen.show()

sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

我有这个结果:

当前代码的图像示例

但我需要这个:

我需要的代码的图像示例

我该怎么做?

python layout qt pyqt pyqt5

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

PyQt - QFileDialog - 直接浏览到一个文件夹?

有没有办法直接浏览到使用QFileDialog的文件夹?

这意味着,不是在导航到目标文件夹时双击每个文件夹,只需在某处输入路径或使用Mac OS X上的Finder中的热键(Shift + Command + G).

谢谢!

编辑:(我的代码)

    filter = "Wav File (*.wav)"
    self._audio_file = QtGui.QFileDialog.getOpenFileName(self, "Audio File",
                                                        "/myfolder/folder", filter)
    self._audio_file = str(self._audio_file)
Run Code Online (Sandbox Code Playgroud)

python qt pyqt qfiledialog

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

当模型是 pandas dataframe 时使 QTableView 可编辑

在我的 gui 文件中,我创建了一个 QTableView,如下所示(这是 Qt Designer 自动生成的部分):

self.pnl_results = QtGui.QTableView(self.tab_3)
font = QtGui.QFont()
font.setPointSize(7)
self.pnl_results.setFont(font)
self.pnl_results.setFrameShape(QtGui.QFrame.StyledPanel)
self.pnl_results.setFrameShadow(QtGui.QFrame.Sunken)
self.pnl_results.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
self.pnl_results.setShowGrid(True)
self.pnl_results.setSortingEnabled(True)
self.pnl_results.setCornerButtonEnabled(True)
self.pnl_results.setObjectName("pnl_results")
Run Code Online (Sandbox Code Playgroud)

然后,我定义一个模型,使我能够将 pandas 数据框链接到 QTableView:

class PandasModel(QtCore.QAbstractTableModel):
    """
    Class to populate a table view with a pandas dataframe
    """

    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.isValid():
            if role == QtCore.Qt.DisplayRole:
                return str(self._data.values[index.row()][index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation …
Run Code Online (Sandbox Code Playgroud)

python qt qtableview pyside pandas

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

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
查看次数

如何在 PySide2 中使用 QLabel 加载图像

我是编码和 python 的初学者。我读到 tkinter 有点“基础”,如果你想开发一个有点复杂的应用程序,而 PyQt 在许可方面有问题。这就是为什么我选择PySide2来开发这种项目,但发现目前文档相对较少。这是正确的选择吗?

我目前的编码问题如下:我试图用 PySide2 加载图像但没有成功。这是我2次尝试的代码:

尝试 N°1:

import sys
import PySide2
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
img = PySide2.QtGui.QImage("/Users/mymac/Downloads/ecg_measure.png")
pixmap=PySide2.QtGui.QPixmap(img)
label = PySide2.QtWidgets.QLabel.setPixmap(pixmap)
label.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

Traceback (most recent call last):

File "<ipython-input-1-86961df4959d>", line 8, in <module>
label = PySide2.QtWidgets.QLabel.setPixmap(pixmap)

TypeError: descriptor 'setPixmap' requires a 'PySide2.QtWidgets.QLabel' object but received a 'PySide2.QtGui.QPixmap'
Run Code Online (Sandbox Code Playgroud)

使用回溯中的信息,我尝试了以下尝试 N°2:

import sys
import PySide2
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
img = PySide2.QtGui.QImage("/Users/mymac/Downloads/ecg_measure.png")
pixmap=PySide2.QtGui.QPixmap(img) …
Run Code Online (Sandbox Code Playgroud)

image qpixmap python-3.x qlabel pyside2

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