2017-10-14 190 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

我已經添加了屏幕截圖到我的代碼現在 –

相關問題