2017-10-11 103 views
0

我正在嘗試使動態小部件,使他們可點擊。通過點擊一個小部件,它應該將動態值傳遞給其他小部件。我曾嘗試發件人()和其他選項訪問小部件,但沒有任何工作。 所有小部件都從最後一個小部件發送信息。PyQt5使動態小部件可點擊並將參數傳遞給另一個函數

下面是代碼:

import sys 
from PyQt5.QtGui import QIcon, QPixmap 
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QLabel, QMessageBox,QSizePolicy, QLayoutItem,QFrame,QHBoxLayout, QGridLayout, QVBoxLayout 
from PyQt5.QtCore import QCoreApplication,QSize,QFileInfo 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 
from functools import partial 
from PyQt5.QtCore import pyqtSlot 
import sip 


class Screen(QWidget): 
    def __init__(self): 

     super(Screen, self).__init__() 

     self.running_layout = QVBoxLayout() 
     self.action_layout = QVBoxLayout() 
     self.layout = QHBoxLayout(self) 
     self.layout.addLayout(self.running_layout) 
     self.layout.addLayout(self.action_layout) 
     self.setLayout(self.layout) 
     self.show() 
     self.all_running()   
     self.actions_1('1') 
    def buttonClicked(self):  
     sender = self.sender() 
     print(sender + ' was pressed') 

    def all_running(self): 
     for i in range(5): 
      button = QLabel("btn "+str(i)) 
      button.mouseReleaseEvent = lambda _ : self.actions_1(str(button.text()).split()[1]) 
      self.running_layout.addWidget(button) 


     button2 = QLabel("btn 5") 
     button2.mouseReleaseEvent = lambda _ : self.actions_1(str(button2.text()).split()[1])   
     self.running_layout.addWidget(button2) 


    def actions_1(self,value): 

     while not self.action_layout.isEmpty(): 
      print(self.action_layout.isEmpty()) 
      widget = self.action_layout.itemAt(0).widget() 
      print("removing", widget) 
      widget.setVisible(False) 
      self.action_layout.removeWidget(widget) 
      del widget 
     self.action_layout = QVBoxLayout() 
     self.layout.addLayout(self.action_layout) 
     val = int(value) 

     for i in range(val): 
      actions_item = QLabel(str(i)) 
      self.action_layout.addWidget(actions_item) 

app = QApplication(sys.argv) 
Gui = Screen() 
sys.exit(app.exec_()) 

編輯:我想爲int傳遞給基礎上,int值小部件,這個數字需要得到填充動作。 這個int基於我使用for循環生成的動態小部件。 例如,如果單擊running_layout「btn 0」的第一個小部件,action_layout中將不會有任何小部件。如果單擊running_layout「btn 1」的第二個小部件,action_layout中將有一個小部件「0」,並且依此類推。 我可以發送信號,但無論哪個動態創建的小部件,我點擊它發送最後一個小部件「btn 4」的值4到action_layout。

+0

你可以在你想要做什麼詳細的解釋。 – eyllanesc

+0

簡而言之:如果您按下小部件btn我然後在其他佈局應該出現我的小部件。 – eyllanesc

+0

這就是我正在尋找的東西。 –

回答

1

爲了簡化任務,我們將創建2個小部件,第一個將是ClickableWidget,它將有一個信號指示與小部件關聯的編號,而第二個DynamicWidget將有一個方法負責更新編號的小工具。

要知道,如果一個元素被按下時,我們使用的方法installEventFilter()eventFilter(),這個過濾器給對象和事件的信息的事件,我們將使用setProperty("index",)存儲號碼。

在第二個小部件中,我實現了一個負責清理小部件並創建一些新小部件的方法。

class ClickableWidget(QWidget): 
    clicked = pyqtSignal(int) 
    def __init__(self, n=5, parent=None): 
     QWidget.__init__(self, parent) 
     self.hlayout = QVBoxLayout(self) 
     for i in range(n): 
      label = QLabel("btn {}".format(i), self) 
      label.setProperty("index", i) 
      self.hlayout.addWidget(label) 
      label.installEventFilter(self) 

    def eventFilter(self, obj, event): 
     if isinstance(obj, QLabel) and event.type() == QEvent.MouseButtonPress: 
      i = obj.property("index") 
      self.clicked.emit(i) 
     return QWidget.eventFilter(self, obj, event) 

class DynamicWidget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.hlayout = QVBoxLayout(self) 

    def changeWidget(self, n): 
     def clearLayout(layout): 
      item = layout.takeAt(0) 
      while item: 
       w = item.widget() 
       if w: 
        w.deleteLater() 
       lay = item.layout() 
       if lay: 
        clearLayout(item.layout()) 
       item = layout.takeAt(0) 

     clearLayout(self.hlayout) 
     for i in range(n): 
      label = QLabel("btn {}".format(i), self) 
      self.hlayout.addWidget(label) 


class Screen(QWidget): 
    def __init__(self): 
     super(Screen, self).__init__() 
     self.layout = QHBoxLayout(self) 
     c = ClickableWidget(6, self) 
     d = DynamicWidget(self) 
     c.clicked.connect(d.changeWidget) 
     self.layout.addWidget(c) 
     self.layout.addWidget(d) 
+0

我建議將任務分開,希望一次完成所有任務都是有問題的。 – eyllanesc

+0

在我所做的兩個小部件的變量都是依賴的,所以我使用了一個類。現在我只是改變它,並使用更多的類。謝謝。 –

+0

請看看這個: https://stackoverflow.com/questions/47062681/pyqt5-addstretch-in-between-widgets –

相關問題