2017-10-14 12 views
0

J'ai un scénario où j'ai une table et je veux afficher un widget de liste sous une cellule particulière sur laquelle je clique.je suis en train de cliquer sur la cellule dans la première colonne et vouloir utiliser sur le clic sur seulement la première cellule (le clic de la cellule est implémenté ici). le seul problème est comment afficher la liste sous la cellule maintenant.?!?!?!Comment ajouter une liste dans une cellule particulière pyqt4

Voir initiale

enter image description here

finale

enter image description here Mon code pour le tableau est le suivant: -

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

Toute aide serait appréciée. Merci

mon code untitled.py est ici qui génère une table dans une fenêtre

# -*- 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

D'après ce que je vois, je comprends que vous voulez ajouter un menu d'options lorsque vous cliquez sur un élément dans le tableau. J'ai raison? – eyllanesc

+0

Première chose - Non non ... le cas est que j'ai une table vide. –

+0

2ème- quand je clique dans n'importe quelle cellule de ma première colonne j'obtiens une liste d'options d'où je choisis ce que je veux ajouter dans cette rangée –

Répondre

1

Pour obtenir la position de la cellule que nous utilisons actuellement les columnViewportPosition() et rowViewportPosition() méthodes qui renvoient la position x, y de la ligne et la colonne respectivement par rapport à la QTableWidget viewport(), nous obtenons la position globale selon la méthode mapToGlobal(), nous allons ajouter la hauteur de la cellule pour la déplacer verticalement.

Il crée un Popup car il va utiliser un QDialog où le QListWidget sera placé, ce widget renvoie le texte sélectionné.

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) 

Screenshot:

enter image description here

+0

Merci l'homme !!!! Ur Gr8 –

+0

J'ai un problème que je ne peux pas quitter le dialogue jusqu'à ce que je sélectionne un élément de it..can ' t nous fermons la boîte de dialogue si nous cliquons dehors et retournons le contrôle dans la fenêtre principale? –

+0

Vous êtes sûr, implémentez cette popup avec QDialog particulièrement de sorte que quand vous cliquez en dehors du QTableWidget il fermera automatiquement. Utilisez-vous seulement mon code ou avez-vous modifié – eyllanesc

0

Je pense que la fonction que vous recherchez est:

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

Où rowNum et colNum est le position, donc 0,0 le mettra dans la case en haut à gauche. itemN est le QListWidget que vous avez créé.

est ici une référence: http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html#setCellWidget

Et voici une question connexe: Adding widgets to qtablewidget pyqt

Après avoir regardé vos captures d'écran je vois l'objet que vous voulez est un QComboBox, pas QListWidget. Lien: http://doc.qt.io/qt-4.8/qcombobox.html

Vous devrez utiliser la fonction d'origine que j'ai mentionnée pour remplir un élément de la table avec une liste déroulante au lieu d'un listWidget. Et puis utilisez addItems pour remplir la zone de liste déroulante avec des options. Et puis utilisez currentText pour voir quelle option l'utilisateur a sélectionnée.

Si cela ne vous convient pas, vous devrez créer une version personnalisée de la tableWidget qui possède les fonctionnalités souhaitées. C'est plus compliqué et je ne peux pas tout couvrir en une seule réponse. Mais si vous avez d'autres questions, je peux essayer de vous orienter dans la bonne direction.

+0

non ce n'est pas ce dont j'avais besoin –

+0

j'ai besoin d'afficher une liste quand je clique dans la cellule .. et la liste est affichée sous la cellule –

+0

j'ai ajouté une capture d'écran à mon code maintenant –