程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换?

开发过程中遇到PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换的问题如何解决?下面主要结合日常开发的经验,给出你关于PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换的解决方法建议,希望对你解决PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换有所启发或帮助;

I have a combo Box with 2 options 'time' or 'interval' when 'time' is SELEcted I would like to show a QTimeEdit and When 'interval is SELEcted I would like to show a QSpinBox.

我可以隐藏间隔小部件并显示时间小部件,但我不知道如何重新定位它以便它显示在间隔小部件所在的位置。

这是我目前所拥有的:

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from PyQt5 import QtCore as qtc

class MainWindow(qtw.QMainWindow):

    def __init__(self):
        super().__init__()
        
        form = qtw.QWidget()
        self.setCentralWidget(form)
        layout = qtw.qformlayout()
        form.setLayout(layout)
        
        self.when_List = qtw.QComboBox(currenTindexChanged=self.on_changE)
        self.when_List.addItem('Every X minutes','interval')
        self.when_List.addItem('At a specific time','time')
        self.interval_Box = qtw.QSpinBox()
        self.time_edit = qtw.QTimeEdit()
        self.event_List = qtw.QComboBox()
        self.event_List.addItem('Event 1')
        self.event_List.addItem('Event 2')
        self.event_msg = qtw.QlineEdit()
        self.add_button = qtw.QPushbutton('Add Event',clicked=self.add_event)

        layout.addRow(self.when_List,self.interval_BoX)
        layout.addRow(self.event_List)
        layout.addRow(self.event_msg)
        layout.addRow(self.add_button)

        self.show()

    def on_change(self):
        if self.when_List.currentData() == 'time':
            # HIDE interval
            self.interval_Box.hIDe()

            # Show time - how do I put this wherE interval_Box was?
            self.time_edit.show()
        elif self.when_List.currentData() == 'interval':
            # HIDe time - ERROR object has no attribute time_edit
            self.time_edit.hIDe()

            # show interval - ERROR object has no attributE interval_Box
            self.interval_Box.show()

    def add_event(self):
        pass

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec())

如何修复错误并在小部件之间动态切换?

解决方法

您可以使用 QStackedWidget(类似于选项卡小部件,但没有选项卡)而不是隐藏和显示小部件,并使用组合框信号来选择哪个显示。

请注意,如果您要设置可以调用该信号的属性并且该插槽使用尚不存在的对象,则不应连接到构造函数中的 *changed 信号:在您的情况下,您已连接currenTindexChanged 信号在构造函数中,但是当一个项目被添加到以前为空的组合框时,该信号总是被调用,并且由于此时 time_edit 对象尚未创建,您将得到一个添加第一项后立即出现 AttributeError。

然在构造函数中使用信号连接很有用,但必须始终小心使用。

class MainWindow(qtw.QMainWindow):

    def __init__(self):
        # ...
        self.when_list = qtw.QComboBox()
        self.when_list.addItem('Every X minutes','interval')
        self.when_list.addItem('At a specific time','time')
        self.when_list.currenTindexChanged.connect(self.on_changE)
        # ...
        self.time_stack = qtw.QStackedWidget()
        self.time_stack.addWidget(self.interval_boX)
        self.time_stack.addWidget(self.time_edit)
        layout.addRow(self.when_list,self.time_stack)
        # ...

    def on_change(self):
        if self.when_list.currentData() == 'time':
            self.time_stack.setCurrentWidget(self.time_edit)
        elif self.when_list.currentData() == 'interval':
            self.time_stack.setCurrentWidget(self.interval_boX)

另一种解决方案可能是删除要隐藏的小部件并使用 QFormLayout 函数在同一位置插入一行,但尽管该布局在许多情况下很有用,但它主要用于漂亮的“静态”界面。另一种方法是使用 QGridLayout,它允许在同一个“单元格”上设置更多小部件:在这种情况下,您可以轻松切换项目的可见性,但它可能会产生一些问题,因为布局也会尝试每次调整其内容(这可以通过对小部件的大小策略使用 setRetainSizeWhenHidden() 来解决。

大佬总结

以上是大佬教程为你收集整理的PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换全部内容,希望文章能够帮你解决PyQt 根据 QComboBox 数据在 QSpinBox 和 QTimeEdit 小部件之间动态切换所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。