如何将组合框中的选定元素保存为 PyQt5 中的变量?

Posted

技术标签:

【中文标题】如何将组合框中的选定元素保存为 PyQt5 中的变量?【英文标题】:How to save selected element from combobox as variable in PyQt5? 【发布时间】:2020-11-12 15:25:45 【问题描述】:

我对如何将组合框中的选定值保存为变量感兴趣,所以当我按下例如B 然后我希望将其保存为 SelectedValueCBox = selected value,在这种情况下为 B。 谢谢你的帮助

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class App(QMainWindow): 
    def __init__(self): 
        super().__init__() 
        self.title = "PyQt5 - StockWindow"
        self.left = 0
        self.top = 0
        self.width = 200
        self.height = 300
        self.setWindowTitle(self.title) 
        self.setGeometry(self.left, self.top, self.width, self.height) 
        self.tab_widget = MyTabWidget(self) 
        self.setCentralWidget(self.tab_widget) 
        self.show() 

class MyTabWidget(QWidget): 
    def __init__(self, parent): 
        super(QWidget, self).__init__(parent) 
        self.layout = QVBoxLayout(self)
        #self.layout = QGridLayout(self) 
        self.tabs = QTabWidget() 
        self.tab1 = QWidget() 
        self.tabs.resize(300, 200) 
        self.tabs.addTab(self.tab1, "Stock-Picker") 
        self.tab1.layout = QGridLayout(self)

        button = QToolButton()
        self.tab1.layout.addWidget(button, 1,1,1,1)

        d = 'AEX':['A','B','C'], 'ATX':['D','E','F'], 'BEL20':['G','H','I'], 'BIST100':['J','K','L']

        def callback_factory(k, v):
           return lambda: button.setText('0_1'.format(k, v))

        menu = QMenu()
        self.tab1.layout.addWidget(menu, 1,1,1,1)
        for k, vals in d.items():
            sub_menu = menu.addMenu(k)
            for v in vals:
                action = sub_menu.addAction(str(v))
                action.triggered.connect(callback_factory(k, v))
            button.setMenu(menu)
      
        self.tab1.setLayout(self.tab1.layout)
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

【问题讨论】:

你的问题有点混乱。首先,您的代码中没有组合框,您是在谈论您在 QToolButton 上设置的菜单吗? 【参考方案1】:

由于您已经为连接返回了一个 lambda,因此解决方案是改用函数。

class MyTabWidget(QWidget):
    def __init__(self, parent):
        # ...
        def callback_factory(k, v):
            def func():
                self.selectedValueCBox = v
                button.setText('0_1'.format(k, v))
            return func

        # ...
        self.selectedValueCBox = None

请注意,您的代码也有很多问题。

首先,您不应该将菜单添加到布局中:不仅没有任何意义(菜单应该弹出,而将其添加到布局中会使它“嵌入”到小部件中,那就是不好),但它也会产生图形问题,特别是因为您将菜单添加到已被按钮占用的同一网格“插槽”(1、1、1、1)中。

使用小部件作为参数创建布局会自动将布局设置为该小部件。虽然在你的情况下它不会产生大问题(因为你已经设置了布局)你不应该用self 创建self.tab1.layout。此外,由于您已经设置了 QVBoxLayout(由于 parent 参数),因此无需再次调用 setLayout()

如果您实际上要添加多个小部件,则小部件容器是有意义的。您只是将 QTabWidget 添加到其布局中,因此它几乎没有用,您应该只是从 QTabWidget 继承。

在将要添加到布局上的小部件上调用 resize 是没有用的,因为布局将负责调整大小,而之前的调整大小调用将被完全忽略。 resize() 仅对***小部件(窗口)或不受布局管理的小部件的罕见情况有意义。

self.layout() 是所有 QWidgets 中的 existing property,你不应该覆盖它。与您在 App 类中使用的 self.width()self.height() 相同。

App 应该引用一个 application 类,但您将它用于 QMainWindow。它们是完全不同类型的类。

最后,您的代码中没有组合框。组合框是与您正在使用的下拉菜单完全不同的小部件。我建议您以后在使用术语时要更加小心,否则您的问题会导致非常混乱,从而使人们无法真正为您提供帮助。

【讨论】:

你的意思是,代码有很多问题?我从另一个用户的上一个问题中复制了代码,并更改了一些变量以使其适合我的程序(这是一个用于股票分析的程序)。这只是我整个代码的一部分。这是 tabwidget 的第一个选项卡,我必须将按下的元素保存为变量,以便能够在另一个选项卡中显示图表。 谢谢它的帮助,顺便说一句。我复制了代码,因为我不知道如何使用 PyQt5 创建一个嵌套的 ComboBox。我对 Tkinter 比较熟悉。 不管是你自己的还是别人的,关键是有很多问题,我都列出来了。您添加其他选项卡这一事实并没有改变这样一个事实,即子类化将只包含一个 QTabWidget 的 QWidget 是无用的。而且,你所做的是一个菜单,而不是一个组合框;它的行为“略微”类似于组合框,因为它有一个可供选择项目的弹出列表,这一事实毫无意义:它们是完全不同的小部件。 好的,但是你将如何创建一个嵌套的组合框? 组合框不适用于分层结构,但无论如何您都可以创建树模型(使用 QStandardItemModel),创建 QTreeView 并使用setView() 将其设置为 QComboBox 的弹出窗口。我建议您研究有关所有这些类的文档,自己尝试一下,如果您仍然无法获得所需的内容,最终会创建一个关于它的新问题。请注意,“您所做的不是组合框”并不意味着您正在做的事情是错误的:我的反对意见是关于您正在使用的 name

以上是关于如何将组合框中的选定元素保存为 PyQt5 中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

从 Pyqt5 中的可检查组合框中获取已检查的文本

如何根据 DataGridView 中的选定行将组合框中的特定项目设置为选定项?

PyQt5:根据选择的元素与数据框中的另一个元素匹配设置自定义组合框文本的字体颜色

PyQt4-如何制作一个按钮来删除组合框中的选定项目?

在 PyQt 中,如何将项目和选定项目保存在组合框中

如何在vfp中的选定组合框中填充列表框?