Reputation: 428
Here in my program i need to create a multiple widget orders so i am using the list of dictionary by using that i create a list of widget.I used mouse release event for clickable widget but i am not getting the object which widget sender clicked.Can any one please help me how to find out the clicked widget index. Given below is my code:
from datetime import datetime
from PyQt4 import QtCore, QtGui
from functools import partial
class Orders(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Orders, self).__init__(parent)
Online_order_dict = [{"Date":"jan-24-2019","Id":"#175","Amount":"191 rs", "Shopping":"Online","Order_City":"Hyderbad","Order_State":"TELANGANA"},{"Date":"jan-25-2019","Id":"#186","Amount": "200 Rs", "Shopping":"Online","Order_City":"Hyderbad","Order_State":"TELANGANA"},{"Date":"jan-29-2019","Id":"#188","Amount": "250 Rs", "Shopping":"Online","Order_City":"Hyderbad","Order_State":"TELANGANA"},{"Date":"jan-25-2019","Id":"#176","Amount": "200 Rs", "Shopping":"Online",
"Order_City":"Hyderbad","Order_State":"TELANGANA"},{"Date":"jan-28-2019","Id":"#201","Amount": "250 Rs", "Shopping":"Online","Order_City":"Hyderbad","Order_State":"TELANGANA"}]
self.qvw1 = QtGui.QWidget()
self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
self.scrollArea.setWidget(self.qvw1)
self.online_order_hbox = QtGui.QVBoxLayout(self.qvw1)
self.online_label = QtGui.QPushButton("Online Order")
self.online_label.setStyleSheet("QPushButton{ background-color: #FF8C00; color: white;outline : None;}")
self.online_order_hbox.addWidget(self.online_label,QtCore.Qt.AlignTop)
self.qvw1.setFixedWidth(round((550)))
for i in Online_order_dict:
self.w1 = QtGui.QWidget()
# self.w1.mouseReleaseEvent=self.myfunction1
self.w1_vbox=QtGui.QVBoxLayout(self.w1)
self.hline1 = QtGui.QFrame();self.hline1.setFrameShape(QtGui.QFrame.HLine)
self.date_label1 = QtGui.QLabel(i["Date"] + " " + i["Id"], alignment= QtCore.Qt.AlignCenter,objectName="small")
self.amount = QtGui.QLabel("Amount:" + i["Amount"])
self.shopping = QtGui.QLabel("Shopping :" + i["Shopping"])
self.ordercity = QtGui.QLabel("Order City :" + i["Order_City"])
self.orderstate = QtGui.QLabel("Order State :" +i["Order_State"])
self.w1_vbox.addWidget(self.date_label1)
self.w1_vbox.addWidget(self.amount)
self.w1_vbox.addWidget(self.shopping)
self.w1_vbox.addWidget(self.ordercity)
self.w1_vbox.addWidget(self.orderstate)
self.w1_vbox.addWidget(self.hline1)
self.online_order_hbox.addWidget(self.w1)
self.setCentralWidget(self.scrollArea)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
settingobj= Orders()
settingobj.show()
settingobj.showFullScreen()
sys.exit(app.exec_())
Upvotes: 0
Views: 197
Reputation: 243897
While an application increases in complexity it is better to use the specialization strategy, that is, create a class that only has a responsibility, in this case create a class that emits a signal when it is pressed with the mouse, and that class must have the information that sample to access it easily.
from PyQt4 import QtCore, QtGui
class InfoWidget(QtGui.QWidget):
clicked = QtCore.pyqtSignal()
def __init__(self, info, parent=None):
super(InfoWidget, self).__init__(parent)
self._info = info
date_label = QtGui.QLabel("{} {}".format(info["Date"], info["Id"]), alignment= QtCore.Qt.AlignCenter, objectName="small")
amount_label = QtGui.QLabel("Amount:{}".format(info["Amount"]))
shopping_label = QtGui.QLabel("Shopping :{}".format(info["Shopping"]))
ordercity_label = QtGui.QLabel("Order City :{}".format(info["Order_City"]))
orderstate_label = QtGui.QLabel("Order State :{}".format(info["Order_State"]))
hline = QtGui.QFrame(frameShape=QtGui.QFrame.HLine)
lay = QtGui.QVBoxLayout(self)
lay.addWidget(date_label)
lay.addWidget(amount_label)
lay.addWidget(shopping_label)
lay.addWidget(ordercity_label)
lay.addWidget(orderstate_label)
lay.addWidget(hline)
@property
def info(self):
return self._info
def mousePressEvent(self, event):
self.clicked.emit()
super(InfoWidget, self).mousePressEvent(event)
class Orders(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Orders, self).__init__(parent)
Online_order_dict = [
{"Date" : "jan-24-2019", "Id" : "#175", "Amount" : "191 rs", "Shopping" : "Online", "Order_City" : "Hyderbad", "Order_State" : "TELANGANA"},
{"Date" : "jan-25-2019", "Id" : "#186", "Amount" : "200 Rs", "Shopping" : "Online", "Order_City" : "Hyderbad", "Order_State" : "TELANGANA"},
{"Date" : "jan-29-2019", "Id" : "#188", "Amount" : "250 Rs", "Shopping" : "Online", "Order_City" : "Hyderbad", "Order_State" : "TELANGANA"},
{"Date" : "jan-25-2019", "Id" : "#176", "Amount" : "200 Rs", "Shopping" : "Online", "Order_City" : "Hyderbad", "Order_State" : "TELANGANA"},
{"Date" : "jan-28-2019", "Id" : "#201", "Amount" : "250 Rs", "Shopping" : "Online", "Order_City" : "Hyderbad", "Order_State" : "TELANGANA"}
]
self.qvw1 = QtGui.QWidget()
self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
self.scrollArea.setWidget(self.qvw1)
online_order_hbox = QtGui.QVBoxLayout(self.qvw1)
self.online_label = QtGui.QPushButton("Online Order")
self.online_label.setStyleSheet("QPushButton{ background-color: #FF8C00; color: white;outline : None;}")
online_order_hbox.addWidget(self.online_label,QtCore.Qt.AlignTop)
self.qvw1.setFixedWidth(550)
for i in Online_order_dict:
w = InfoWidget(i)
w.clicked.connect(self.on_info_clicked)
online_order_hbox.addWidget(w)
self.setCentralWidget(self.scrollArea)
@QtCore.pyqtSlot()
def on_info_clicked(self):
w = self.sender()
print(w.info)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
settingobj= Orders()
settingobj.showFullScreen()
sys.exit(app.exec_())
Upvotes: 2