python - PyQt allign चेकबॉक्स और इसे हर पंक्ति में डाल दिया




checkbox qtablewidget (2)

मैं चेक बॉक्स के साथ ऐसा करने की कोशिश कर रहा हूं दुर्भाग्य से सी ++ के लिए बनाया गया है और पायथन के कोड के किसी भी अनुकूलन के परिणामस्वरूप यह त्रुटि है: '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() डाल दिया है तो यह कह रहा है कि इसे पायथन में लागू नहीं किया गया है। तो, मैं प्रत्येक पंक्ति के पास पाठ क्षेत्र के बिना केंद्र में उस चेकबॉक्स को कैसे जोड़ सकता हूं? किसी भी सुझाव के लिए अग्रिम में धन्यवाद।

बाद में संपादित करें: पाश के अंदर कोड चल रहा है, लेकिन मैं चेक को नियंत्रित नहीं कर सकता:

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)

यह एक स्क्रीनशूट है मैं कैसे जान सकता हूँ कि मैंने क्या जाँच किया और सेट सूची तैयार की है?


आप क्यूटी डिजाइनर का उपयोग करने पर विचार कर सकते हैं, ताकि आप यह कर सकें:

  • तत्काल प्रतिक्रिया के साथ अपने इच्छित लेआउट नेत्रहीन प्राप्त करें
  • इसे से उत्पन्न वास्तविक कोड को देखने के लिए और आप याद कर रहे थे कि क्या जगह मिलते हैं

अपनी वांछित विंडो प्राप्त करने के बाद (ie .ui एक्सटेंशन के साथ फ़ाइल), आप pyuic5 [1] उपयोगिता का उपयोग कर सकते हैं, जो कि यूआई फाइल से एक पायथन फाइल उत्पन्न करेगा। मैन पेज से

pyuic5 - पायथन कोड के लिए Qt5 उपयोगकर्ता इंटरफ़ेस संकलित करें

कदम

उदाहरण के साथ सरल कदम

बनाएँ और सहेजें यूआई

आपको क्यूटी डिजाइनर का उपयोग करना चाहिए और .ui फ़ाइल को सहेजना चाहिए।

UI फ़ाइल से अजगर कोड उत्पन्न करें

यदि आपकी .ui फ़ाइल का नाम mainwindow.ui तो आप कमांड का उपयोग कर सकते हैं:

pyuic5 mainwindow.ui -o mainwindow.py

अपना पायथन कोड अपडेट करें

उत्पन्न पायथन-आधारित 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)

जैसा कि आप ऊपर देख सकते हैं, आपको पायथन मॉड्यूल से यूआई का प्रतिनिधित्व करने वाले वर्ग को आयात करना होगा, जो उत्पन्न हुआ था, हमारे मामले में mainwindow.py में कमांड से mainwindow.py फ़ाइल है। कदम।

उपयोगिता द्वारा क्लास स्वतः Ui_ साथ प्रीफ़िक्स है। फिर आप एक QMainWindow और जनरेटेड वर्ग को इन्स्तांत करते हैं और सभी विजेट, आदि को शामिल करने के लिए क्यूटी की बिल्ट-इन विधि setupUi का उपयोग करते हैं।

महत्वपूर्ण: हर बार जब आप Qt Designer में अपनी विंडो को अपडेट करते हैं, तो आपको चरण # 2 को दोहराने की आवश्यकता होगी डिज़ाइनर का सीधे उपयोग करके सहेजे गए समय की मात्रा को ध्यान में रखते हुए, यह एक समस्या नहीं होनी चाहिए।

नोट: आप कोड को पढ़ने के लिए उत्पन्न mainwindow.py फ़ाइल का उपयोग कर सकते हैं और देखें कि वांछित लेआउट कैसे हासिल किया गया था। यह उपयोगी होगा यदि आप वास्तव में इस दृष्टिकोण का उपयोग करना जारी रखना नहीं चाहते हैं।

[1] pyuic5 आदेश pyqt5-dev-tools पैकेज के भीतर पाया जाता है, इसलिए एक sudo apt-get install pyqt5-dev-tools इसे करना चाहिए।


एखुमोरो का यह उदाहरण है कि जब यह क्लिक किया जाता है तब क्या जांच की जाती है:

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_())






pyqt5