QFormLayout的PyQt5顶行没有响应鼠标点击

Posted

技术标签:

【中文标题】QFormLayout的PyQt5顶行没有响应鼠标点击【英文标题】:PyQt5 top row of QFormLayout not responding to mouse click 【发布时间】:2022-01-15 16:51:47 【问题描述】:

将 QtDesigner 和 PyQt5 与 pyuic5 一起使用,我正在设置具有可变行数的 FormLayout。 每行都是在 QtDesigner 中创建的自定义小部件,由 QLabel 和包含 QLineEdit 和 QPushButton 的 QHBoxLayout 组成。

我使用

创建行用户界面
    def get_data_widget(parent=None, **kwargs):
        widget = QtWidgets.QWidget(parent)
        dlg_ui = wgtDataRow.Ui_Form()       # from the custom made widget
        dlg_ui.setupUi(widget)
    
        # recursively ensure all objectName()s are unique
        rename_widget(widget, "_%s" % unique_id())
    
        dlg_ui.label.setText(kwargs.get('name') or '')
        dlg_ui.editData.setText(kwargs.get('value') or '')
    
        return dlg_ui

在 QDialog 方法中将行 UI 插入到 QFormLayout 中:

    def add_data_entry_row(self, name, **kwargs):
        # simplified code, but this is the bit that affects the QFormLayout
        posn = kwargs.get('position', 0)
        data_ui = get_data_widget(self, name=name, value=kwargs.get('value'))
        self.dlg_ui.formLayout.insertRow(posn, data_ui.label, data_ui.widget)

我遇到的问题是 QFormLayout 的第一行没有响应鼠标点击。

如果我在 0 处插入新行,则先前无响应的行将向下移动并变为响应,而新的(顶部)行无响应。

任何人都可以对此有所了解吗?

【问题讨论】:

好吧,越来越好奇了。如果我展开包含对话框,在短暂的时间间隔后,顶行 QPushButton 会响应鼠标单击,但 QLineEdit 仍然没有响应 请提供minimal reproducible example。 墨菲再次出击!我花了一些时间设置了一个最小的示例,尽管 pyuic5 生成的代码并不是那么简单,当然,一切都很完美。 【参考方案1】:

在尝试生成具有相同问题的最小示例时,我找到了原因。基本上我在执行 show() 之前对 UI 进行了更改 我所拥有的(为了清楚起见,代码最小化)

class Dialog(QtWidgets.QDialog):
    def __init__(self, **kwargs):
        super().__init__()
        self.dlg_ui = Ui_Dialog()
        self.dlg_ui.setupUi(self)
        self.setModal(True)
        
        self.init_ui(**kwargs)  # load the UI widgets with data
        
        self.show()

应该是的

class Dialog(QtWidgets.QDialog):
    def __init__(self, **kwargs):
        super().__init__()
        self.dlg_ui = Ui_Dialog()
        self.dlg_ui.setupUi(self)
        self.setModal(True)
        
        self.show()  # excute BEFORE loading the UI
        
        self.init_ui(**kwargs)  # load the UI widgets with data

【讨论】:

以上是关于QFormLayout的PyQt5顶行没有响应鼠标点击的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5保姆级教程-- 从入门到精通

为啥当我放大Windows尺寸时,pyqt5中笔没有在鼠标坐标点上绘画

PyQt5 笔记(01):嵌套布局

PyQt5-Qt Designer简易的数字键盘输入

在 PyQt5 小部件中检测单击鼠标 - 缺少 mouseClickEvent 函数

在 QFormLayout 中动态创建的 QWidget 没有框架,即使明确要求这样做