PyQt 对齐复选框并将其放在每一行中
PyQt allign checkbox and put it in every row
我正在尝试 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我怎么知道我检查了什么并构建了集合列表?
您可以考虑使用 Qt Designer,这样您就可以:
- 通过即时反馈直观地获得您想要的布局
- 查看从中生成的实际代码并找出您遗漏的内容
获得所需的 window(即扩展名为 .ui
的文件)后,您可以使用 pyuic5
[1] 实用程序,它将生成 Python 文件来自 UI 文件。来自手册页
pyuic5 - compile Qt5 user interfaces to Python code
步骤
带有示例的简单步骤
创建并保存 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 的 class,在我们的例子中是 mainwindow.py
来自上一个命令的文件。步骤。
class 由实用程序自动添加 Ui_
前缀。然后实例化一个 QMainWindow
和生成的 class 并使用 Qt 的 built-in 方法 setupUi
以合并所有小部件等
重要提示: 每次在 Qt Designer 中更新 window 时,您都需要重复步骤 #2。考虑到直接使用 Designer 节省的时间,这应该不是问题。
注意:您可以使用生成的mainwindow.py
文件来阅读代码并查看如何实现所需的布局。如果您真的不想想继续使用这种方法,这应该很有用。
[1] pyuic5
命令可以在 pyqt5-dev-tools
包中找到,所以 sudo apt-get install pyqt5-dev-tools
应该可以做到。
这里 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_())
我正在尝试 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我怎么知道我检查了什么并构建了集合列表?
您可以考虑使用 Qt Designer,这样您就可以:
- 通过即时反馈直观地获得您想要的布局
- 查看从中生成的实际代码并找出您遗漏的内容
获得所需的 window(即扩展名为 .ui
的文件)后,您可以使用 pyuic5
[1] 实用程序,它将生成 Python 文件来自 UI 文件。来自手册页
pyuic5 - compile Qt5 user interfaces to Python code
步骤
带有示例的简单步骤
创建并保存 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 的 class,在我们的例子中是 mainwindow.py
来自上一个命令的文件。步骤。
class 由实用程序自动添加 Ui_
前缀。然后实例化一个 QMainWindow
和生成的 class 并使用 Qt 的 built-in 方法 setupUi
以合并所有小部件等
重要提示: 每次在 Qt Designer 中更新 window 时,您都需要重复步骤 #2。考虑到直接使用 Designer 节省的时间,这应该不是问题。
注意:您可以使用生成的mainwindow.py
文件来阅读代码并查看如何实现所需的布局。如果您真的不想想继续使用这种方法,这应该很有用。
[1] pyuic5
命令可以在 pyqt5-dev-tools
包中找到,所以 sudo apt-get install pyqt5-dev-tools
应该可以做到。
这里 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_())