如何将组合框中的选定元素保存为 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 中的变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 DataGridView 中的选定行将组合框中的特定项目设置为选定项?