【问题标题】:PyQt allign checkbox and put it in every rowPyQt 对齐复选框并将其放在每一行
【发布时间】:2015-12-04 03:46:14
【问题描述】:

我正在尝试使用复选框执行this。 遗憾的是,它是为 C++ 制作的,任何对 Python 代码的改编都会导致此错误:'QWidget' object is not callable 我想做的是在每一行添加一个复选框,这是我的代码:

    pWidget = QWidget()
    pCheckbox = QCheckBox()
    pLayout = QVBoxLayout()
    pLayout.addWidget(pCheckbox)
    pLayout.setAlignment(Qt.AlignCenter)
    pLayout.setContentsMargins(0, 0 ,0, 0)
    pWidget.setLayout(pLayout)

    for char in accounts:
        for columnNumber in range(numberColumns):
            chkBoxItem = QTableWidgetItem()
            chkBoxItem.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            chkBoxItem.setCheckState(Qt.Unchecked)
            self.mainAccountTable.insertRow(currentRowCount)
            self.mainAccountTable.setItem(currentRowCount, 0, pWidget(chkBoxItem))
            self.mainAccountTable.setItem(currentRowCount, 1, QTableWidgetItem(data[1]))

如果我输入pLayout = Layout() 表示它没有在 Python 中实现。 那么,我怎样才能添加在中心对齐的复选框,而不是每行附近的文本区域?提前感谢您的任何提示。

稍后编辑: 在循环内移动代码是有效的,但我无法控制检查:

for char in accounts:
        for columnNumber in range(numberColumns):
            pWidget = QWidget()
            pCheckbox = QCheckBox()
            pLayout = QVBoxLayout(pWidget)
            pLayout.addWidget(pCheckbox)
            pLayout.setAlignment(Qt.AlignCenter)
            pLayout.setContentsMargins(0, 0 ,0, 0)
            pWidget.setLayout(pLayout)
            #chkBoxItem = QTableWidgetItem()
            #chkBoxItem.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            #chkBoxItem.setCheckState(Qt.Unchecked)
            self.mainAccountTable.insertRow(currentRowCount)
            self.mainAccountTable.setCellWidget(currentRowCount, 0, pWidget)

这是screenshoot我怎么知道我检查和构建的集合列表?

【问题讨论】:

    标签: python checkbox pyqt qtablewidget pyqt5


    【解决方案1】:

    这里是an example from ekhumoro,用于查找点击时检查的内容:

    from PyQt4 import QtGui, QtCore
    
    class Window(QtGui.QWidget):
        def __init__(self, rows, columns):
            QtGui.QWidget.__init__(self)
            self.table = QtGui.QTableWidget(rows, columns, self)
            for column in range(columns):
                for row in range(rows):
                    item = QtGui.QTableWidgetItem('Text%d' % row)
                    if row % 2:
                        item.setFlags(QtCore.Qt.ItemIsUserCheckable |
                                      QtCore.Qt.ItemIsEnabled)
                        item.setCheckState(QtCore.Qt.Unchecked)
                    self.table.setItem(row, column, item)
            self.table.itemClicked.connect(self.handleItemClicked)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.table)
            self._list = []
    
        def handleItemClicked(self, item):
            if item.checkState() == QtCore.Qt.Checked:
                print('"%s" Checked' % item.text())
                self._list.append(item.row())
                print(self._list)
            else:
                print('"%s" Clicked' % item.text())
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window(6, 3)
        window.resize(350, 300)
        window.show()
        sys.exit(app.exec_())
    

    但您也可以迭代您的行并在正确的列上使用.findChild(type(QtGui.QCheckBox())).isChecked()

    如:

    from PyQt4 import QtGui, QtCore
    from PyQt4.QtCore import Qt
    
    class Window(QtGui.QWidget):
        def __init__(self, rows, columns):
            QtGui.QWidget.__init__(self)
            self.table = QtGui.QTableWidget(rows, columns, self)
            for row in range(rows):
                qwidget = QtGui.QWidget()
                checkbox = QtGui.QCheckBox()
                checkbox.setCheckState(QtCore.Qt.Unchecked)
                qhboxlayout = QtGui.QHBoxLayout(qwidget)
                qhboxlayout.addWidget(checkbox)
                qhboxlayout.setAlignment(Qt.AlignCenter)
                qhboxlayout.setContentsMargins(0, 0, 0, 0)
                self.table.setCellWidget(row, 0, qwidget)
                self.table.setItem(row, 1, QtGui.QTableWidgetItem(str(row)))
            layout = QtGui.QVBoxLayout(self)
            self.button = QtGui.QPushButton()
            self.button.setObjectName("loadButton")
            layout.addWidget(self.table)
            layout.addWidget(self.button)
            self.button.clicked.connect(self.ButtonClicked)
    
        def ButtonClicked(self):
            checked_list = []
            for i in range(self.table.rowCount()):
                if self.table.cellWidget(i, 0).findChild(type(QtGui.QCheckBox())).isChecked():
                    checked_list.append(self.table.item(i, 1).text())
            print checked_list
    
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window(3, 2)
        window.resize(350, 300)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 我看到了那个例子,但这不是我需要的行为。我需要这个falsinsoft.blogspot.ro/2013/11/… 的解决方案
    • 您应该使用 findChild 然后迭代每一行。这将允许您找出检查了哪些单元格。
    • 但是你如何调整“handle”方法来检查是否被推送?如果是,则将其添加到列表中。
    • 此外,如果我使用该命令进行检查,他将不会检查第一列(复选框在哪里),而是从下一列检查:(
    • 我添加了一个实现示例。
    【解决方案2】:

    您可以考虑使用Qt Designer,这样您就可以:

    • 通过即时反馈直观地获得您想要的布局
    • 查看从中生成的实际代码并找出您遗漏的内容

    获得所需窗口(即扩展名为.ui 的文件)后,您可以使用pyuic5[1] 实用程序,该实用程序将从UI 文件生成Python 文件。从手册页

    pyuic5 - 将 Qt5 用户界面编译成 Python 代码

    步骤

    简单的步骤与示例

    创建并保存 UI

    您应该使用 Qt 设计器并保存 .ui 文件。

    从 UI 文件生成 Python 代码

    如果您的 .ui 文件名为 mainwindow.ui,那么您可以使用以下命令:

    pyuic5 mainwindow.ui -o mainwindow.py
    

    更新您的 Python 代码

    让您的 Python 代码使用生成的基于 Python 的 UI 文件。

    from PyQt5.QtWidgets import QMainWindow
    
    from mainwindow import Ui_MainWindow   # <<--- important
    
    # Set up the user interface from Designer.
    win = QMainWindow()
    gui = Ui_MainWindow()
    gui.setupUi(win)
    

    正如您在上面看到的,您需要从生成的 Python 模块中导入代表 UI 的类,在我们的例子中是来自 prev 中的命令的 mainwindow.py 文件。一步。

    该实用程序会自动为该类添加前缀Ui_。然后实例化一个QMainWindow 和生成的类,并使用Qt 的内置方法setupUi 来合并所有小部件等。

    重要提示:每次在 Qt Designer 中更新窗口时,都需要重复第 2 步。考虑到直接使用 Designer 节省的时间,这应该不是问题。

    注意:您可以使用生成的mainwindow.py 文件来读取代码并查看如何实现所需的布局。如果您真的想继续使用这种方法,这应该很有用。

    [1] pyuic5 命令在 pyqt5-dev-tools 包中找到,所以 sudo apt-get install pyqt5-dev-tools 应该这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 2011-02-27
      • 2017-10-12
      • 1970-01-01
      • 2023-01-24
      • 2015-07-15
      • 2019-09-18
      • 2011-11-02
      相关资源
      最近更新 更多