[英]How to save selected element from combobox as variable in PyQt5?
我对如何将组合框中的选定值保存为变量很感兴趣,因此当我按例如 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_())
由于您已经为连接返回了 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
(由于父参数),因此无需再次调用setLayout()
。
如果您实际上要添加多个小部件,则小部件容器是有意义的。 你只是在它的布局中添加了一个 QTabWidget,所以它几乎没用,你应该只是从 QTabWidget 子类化。
在将要添加到布局上的小部件上调用resize
是没有用的,因为布局将负责调整大小,而之前的调整大小调用将被完全忽略。 resize()
仅适用于顶级小部件(窗口)或不由布局管理的小部件的罕见情况。
self.layout()
是所有 QWidget 的现有属性,您不应该覆盖它。 与您在App
类中使用的self.width()
和self.height()
相同。
App
应该引用一个应用程序类,但您将它用于 QMainWindow。 它们是完全不同类型的类。
最后,您的代码中没有组合框。 组合框是一种与您正在使用的下拉菜单完全不同的小部件。 我建议您以后对术语要更加小心,否则您的问题会导致非常混乱,使人们无法真正为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.