2017-02-12 266 views
0

我有一個按鈕的網格,每個按鈕都位於它自己的groupbox內。我想動態更新這些按鈕的標籤。PyQt5 setText by object name?

我不清楚如何在迭代中創建這些按鈕後才能解決這些按鈕,並且有辦法解決它們的對象名稱。

我讀過的文檔似乎沒有包含任何通過對象名稱的settext方法。這是可能的還是有更好的方法來做到這一點?

PyQt5,Python的3.6

+0

[QButtonGroup](https://doc.qt.io/qt-5/qbuttongroup.html)。 – ekhumoro

+0

@ekhumoro。我不確定你的建議。我的每個按鈕都位於QGroupBox內,作爲在每個按鈕上方添加嚴格標籤的方式。我也希望改變個別盒子的背景顏色以響應事件(不需要改變按鈕本身的顏色,因爲我也想將它作爲不同事件的指示器)。我可以給QGroupBoxes分配一個整數id,就像我真正的按鈕小部件一樣嗎?目前他們被添加到QGridLayout。 – chmedly

+0

每個按鈕都有它的組框作爲父項,所以你可以用'button.parent()'來訪問它。按鈕組提供統一的方式來訪問一組按鈕(使用ID),並通過單個連接處理所有信號。這只是一個簡單的便利課程,無需您自己管理按鈕。 (PS:你也可以[使用Qt Designer設置按鈕組](http://stackoverflow.com/a/41861892/984421))。 – ekhumoro

回答

0

如果你已經把一個名字部件與功能:

{your parent widget}.findChild({name class}, {your name}) 

{your widget}.setObjectName({your name}) 

你可以通過findChild功能通過父訪問

例如:

import sys 

from PyQt5.QtCore import QTimer 
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget 


class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent=parent) 
     self.verticalLayout = QVBoxLayout(self) 
     # self.verticalLayout.setObjectName("verticalLayout") 
     for i in range(10): 
      pushButton = QPushButton(self) 
      pushButton.setObjectName("pushButton{}".format(i)) 
      pushButton.setText(str(i)) 
      self.verticalLayout.addWidget(pushButton) 

     timer = QTimer(self) 
     timer.setInterval(1000) 
     timer.timeout.connect(self.updateText) 
     timer.start() 

    def updateText(self): 
     for i in range(10): 
      child = self.findChild(QPushButton, "pushButton{}".format(i)) 
      counter = int(child.text()) 
      child.setText(str(counter+1)) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Widget() 
    w.show() 
    sys.exit(app.exec_()) 
相關問題