2017-10-14 175 views
0

我有一个场景,我有一个表格,我想在特定单元格下显示列表窗口小部件,我点击了单元格。只需要点击第一个单元格(单元格点击在这里实现)。唯一的问题是如何在单元格下显示列表。?!?!?!如何在特定单元格中添加列表pyqt4

初始视图

enter image description here

最终

enter image description here 我对表的代码是: -

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

从我看到我的理解是你要添加的选项菜单当你点击表格中的项目。我是对的? – eyllanesc

+0

第一件事 - 不,不......这种情况是我有一张空桌子。 –

+0

2nd-当我点击我的第一列的任何单元格时,我会从中选择一个选项列表,我从中选择我想要添加的那一行。 –

回答

1

为了让我们使用的columnViewportPosition()rowViewportPosition()方法,返回位置x当前单元格的位置,行和列的Y相同关于QTableWidget的viewport(),然后我们得到使用全球定位的mapToGlobal()方法,我们将添加单元格的高度以垂直移动它。

它创建一个Popup,它将使用QListWidget将被放置的QDialog,这个小部件返回选定的文本。

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) 

截图:

enter image description here

+0

谢谢你!!!! Ur Gr8。 –

+0

我有一个问题,我不能离开对话框,直到我从中选择一个项目..可以'如果我们在外面点击它,关闭对话框并在主窗口中返回控制? –

+0

您确定,特别是使用QDialog实现此弹出窗口,以便当您单击QTableWidget外部时,它将自动关闭。是仅使用我的代码还是修改了它是? – eyllanesc

0

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

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自定义版本。这是更复杂的,我不能在一个单一的答案覆盖全部。但如果你有更多的问题,我可以试着指出你的方向。

+0

不,这不是我所需要的 –

+0

我需要显示一个列表,当我点击单元格..并且列表显示在单元格下面 –

+0

我已经添加了屏幕截图到我的代码现在 –

相关问题