【问题标题】:How to add a list in a particular cell pyqt4如何在特定单元格pyqt4中添加列表
【发布时间】:2018-03-26 08:54:58
【问题描述】:

我有一个场景,我有一个表格,我想在我点击的特定单元格下显示一个列表小部件。我正在点击第一列中的单元格,并且只想在点击第一个单元格时使用。 (此处实现单元格点击)。唯一的问题是现在如何在单元格下显示列表。?!?!?!

初始视图

最终

我的表格代码是:-

from untitled import *
from PyQt4 import QtGui # Import the PyQt4 module we'll need
import sys # We need sys so that we can pass argv to QApplication
import os

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

from PyQt4 import QtGui, QtCore



class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.tableWidget.clicked.connect(self.hello)

    def hello(self,item):
        #print(item.column())
        if item.column()==0 :
            print("success")
            #I want to add this List at this cell of table
            itemN = QtGui.QListWidget()
            #hlayout = QtGui.QHBoxLayout()
            #hlayout.addWidget(itemN)
            #self.setCentralWidget(itemN)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

任何帮助将不胜感激。 谢谢

我的 untitled.py 代码在这里,它在窗口中生成一个表格

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.tableWidget = QtGui.QTableWidget(self.centralwidget)
        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setRowCount(13)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(3, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(4, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(5, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(6, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(7, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(8, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(9, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(10, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(11, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(12, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtGui.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(1)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(2)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(3)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(4)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(5)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(6)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(7)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(8)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(9)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(10)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(11)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.verticalHeaderItem(12)
        item.setText(_translate("MainWindow", "New Row", None))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "a", None))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "b", None))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "New Column", None))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "d", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 第一件事-不不...情况是我有一张空桌子。
  • 第二-当我点击第一列的任何单元格时,我会得到一个选项列表,从中我可以选择我想在该行中添加的内容
  • 我把第一张图片贴错了,可能单元格必须是空的,对不起
  • 是的,你是对的。我想单击第一列中的一个空单元格,然后打开一个列表以从中选择选项,然后将其作为该行中的新项目加载。我正在点击第一列的单元格,但我遇到了点击后如何显示该列表的问题?
  • 每个单元格的列表选项都是固定的

标签: python python-3.x pyqt pyqt4 qtablewidget


【解决方案1】:

为了获取当前单元格的位置,我们使用columnViewportPosition()rowViewportPosition()方法分别返回行和列相对于QTableWidgetviewport()的位置x,y,然后我们得到全局位置使用mapToGlobal() 方法,我们将添加单元格的高度以使其垂直移动。

它会创建一个弹出窗口,因为它将使用一个 QDialog,其中 QListWidget 将被放置,这个小部件返回选定的文本。

class PopUp(QDialog):
    def __init__(self, labels):
        QDialog.__init__(self, None, Qt.Popup | Qt.FramelessWindowHint)
        self.itemSelected = ""
        self.setLayout(QVBoxLayout())
        lWidget = QListWidget(self)
        self.layout().addWidget(lWidget)
        lWidget.addItems(labels)
        lWidget.itemClicked.connect(self.onItemClicked)
        self.layout().setContentsMargins(0, 0, 0, 0)

    def onItemClicked(self, item):
        self.itemSelected = item.text()
        self.accept()

    def text(self):
        return self.itemSelected


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.tableWidget.clicked.connect(self.onClicked)

    def onClicked(self, index):
        row = index.row()
        column = index.column()
        x = self.tableWidget.columnViewportPosition(column)
        y = self.tableWidget.rowViewportPosition(row) + self.tableWidget.rowHeight(row)
        pos = self.tableWidget.viewport().mapToGlobal(QPoint(x, y))
        p = PopUp(["1", "2", "3", "4", "5"])
        p.move(pos)
        if p.exec_() == QDialog.Accepted:
            t_item = QTableWidgetItem(p.text())
            self.tableWidget.setItem(row, column, t_item)

截图:

【讨论】:

  • 我有一个问题,我不能离开对话框,直到我从中选择一个项目..如果我们在外面点击,我们不能关闭对话框吗?并在主窗口中返回控件?
  • 您当然可以使用 QDialog 实现此弹出窗口,这样当您在 QTableWidget 外部单击时,它会自动关闭。你是只使用我的代码还是修改了它?
  • 你的操作系统是什么? PyQt4 库的版本?
  • 图片不会用于检查错误、保存视频并将其上传到驱动器、保管箱或类似设备并在此处分享链接
  • 是的,我也在考虑同样的问题,请给我一点时间去买一台录像机
【解决方案2】:

我认为您正在寻找的功能是:

self.tableWidget.setCellWidget(rowNum, colNum, itemN)

其中 rowNum 和 colNum 是位置,所以 0,0 会放在左上角的框中。 itemN 是你创建的 QListWidget。

这是一个参考: http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html#setCellWidget

这是一个相关的问题:Adding widgets to qtablewidget pyqt

查看您的屏幕截图后,我发现您想要的对象是 QComboBox,而不是 QlistWidget。 链接:http://doc.qt.io/qt-4.8/qcombobox.html

您需要使用我提到的原始函数来用组合框而不是 listWidget 填充表格的元素。然后使用 addItems 用选项填充组合框。然后使用 currentText 查看用户选择了哪个选项。

如果这听起来不像您想要的,您必须制作具有您想要的功能的 tableWidget 的自定义版本。那更复杂,我无法在一个答案中涵盖所有内容。但是,如果您有更多问题,我可以尝试为您指明正确的方向。

【讨论】:

  • 当我点击单元格时需要显示一个列表......并且列表将显示在单元格下方
  • 我不明白人们是否不知道他们为什么投反对票的答案:(新人。
猜你喜欢
  • 2020-09-17
  • 2020-05-28
  • 2021-06-27
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2023-01-05
  • 2019-03-25
相关资源
最近更新 更多