簡體   English   中英

單擊更改 QPushButton 文本

[英]changing QPushButton text on click

我正在編寫一個簡單的 GUI 程序,需要我的按鈕在單擊時更改文本。 我像在示例中一樣對其進行了編碼,但它不起作用。

來自示例的代碼:

class MyWidget(QtWidgets.QWidget):

    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
            "Hola Mundo", "Привет мир"]
        self.button = QtWidgets.QPushButton("Click me!")
        self.text = QtWidgets.QLabel("Hello World")
        self.text.setAlignment(QtCore.Qt.AlignCenter)
        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

        self.button.clicked.connect(self.magic)


    def magic(self):
        self.text.setText(random.choice(self.hello))

我的代碼:

class Form(QWidget):
    def __init__(self):
        super(Form, self).__init__()

        # Font
        r_one = QFont("RussoOne-Regular", 40, QFont.Bold) 

        # Buttons
        self.pvz_p_score = QPushButton('0')
        self.pvz_z_score = QPushButton('0')
        self.pvt_p_score = QPushButton('0')
        self.pvt_t_score = QPushButton('0')
        self.pvp_p1_score = QPushButton('0')
        self.pvp_p2_score = QPushButton('0')

        buttons = [self.pvz_p_score, 
                   self.pvz_z_score, 
                   self.pvt_p_score, 
                   self.pvt_t_score, 
                   self.pvp_p1_score,
                   self.pvp_p2_score]

        for b in buttons:
            b.setStyleSheet('QPushButton {background-color: #8ffe09;\
                                          color: black;\
                                          border: none}')
            b.setFlat(True)
            b.setIconSize(QSize(100,100))
            b.setFont(r_one)
            b.setContextMenuPolicy(Qt.CustomContextMenu)
            b.clicked.connect(self.left_click)
            b.customContextMenuRequested.connect(self.right_click)

...

    def left_click(self):
        self.text.setText(int(self.text)+1)

    def right_click(self):
        if int(self.text) > 0: button.text.setText(int(self.text)-1)

但是,在我的例子中, self對應於Form ,在示例中它鏈接到button 有任何想法嗎?

  1. self.text指的是 QLabel 小部件。 因此,它無法轉換為整數供您比較。
  2. QLabel 的text()及其方法setText()使用字符串,而不是整數。 要設置文本,您可以將數字轉換為字符串,或使用setNum() ,它接受整數和浮點值(但沒有num()函數)。
    def left_click(self):
        self.text.setText(str(int(self.text.text()) + 1))
        # alternatively:
        # self.text.setNum(int(self.text.text()) + 1)

    def right_click(self):
        if int(self.text.text()) > 0:
            button.text.setText(str(int(self.text.text()) - 1))
            # alternatively:
            # button.text.setNum(int(self.text.text()) - 1)

請注意,我假設文本存在並且可以轉換為整數。

好的,這個問題有點愚蠢,我搞砸了一些基本的 python 東西,但現在已經解決了。 希望它能幫助別人。

首先, self.text不是類Form的字段,因為沒有這樣的字段,如示例所示。 相反,對於我想做的事情,我需要以某種方式將按鈕對象傳遞給函數並像button.text()button.setText()一樣訪問它。

由於我所有的按鈕都存儲在列表buttons中,我可以通過它輕松地進行迭代,因此我決定創建 2 個返回函數的函數:

for b in buttons:
    # I skipped style-related code
    b.clicked.connect(self.get_left_click(b))
    b.customContextMenuRequested.connect(self.get_right_click(b))

...

def get_left_click(self, button):
        def left_click(self):
            button.setText(str(int(button.text())+1))
        return left_click

def get_right_click(self, button):
    def right_click(self):
        if int(button.text()) > 0: button.setText(str(int(button.text())-1))
    return right_click

另外, QPushButton.setText()不支持整數,所以我不得不用str(...)

PS 我希望有更好的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM