PyQt allign复选框并将其放在每一行

时间:2015-09-08 12:39:20

标签: python checkbox pyqt qtablewidget pyqt5

我正在尝试使用复选框执行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我如何知道我检查了什么并构建了设置列表?

2 个答案:

答案 0 :(得分:1)

您可以考虑使用Qt Designer,以便:

  • 通过即时反馈直观地获取所需的布局
  • 查看从中生成的实际代码并发现您缺少的内容

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

  

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

的步骤

使用示例的简单步骤

创建并保存UI

您应该使用Qt Designer并保存.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应该执行此操作。

答案 1 :(得分: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_())