可枚举的 Qt 小部件

Posted

技术标签:

【中文标题】可枚举的 Qt 小部件【英文标题】:Enumerable Qt widgets 【发布时间】:2010-11-09 20:02:47 【问题描述】:

我有一个 Qt 对话框,其中包含几个需要或多或少统一处理的控件。我想将指向它们的指针存储在一个数组中并枚举它们。

在 Windows 中,我会在循环中使用顺序控制 ID 和 GetDlgItem(hDlg, IDC_BASEID + i)。在 Cocoa 中,我会使用顺序视图标签或将它们包含在不可见的容器中。 Qt 的方式是什么?

【问题讨论】:

How to reach iteratively few variables which names differ only by number in C++?的可能重复 请查看我对链接问题的回答,我相信它可以满足您的需求。 【参考方案1】:

如果小部件名称相似,也许 QObject::findChildren(QRegExp) 可以解决问题。

QList<QLineEdit*> lineEdits = dialog->findChildren<QLineEdit*>(QRegExp("lineEdit[0-9]+"));
foreach (QLineEdit* lineEdit, lineEdits) 
    lineEdit->clear();

【讨论】:

【参考方案2】:

欺骗的答案告诉你如何做到这一点 - 但你可能不应该

Qt 方法是为所有小部件注册相同的插槽(即处理程序) - 然后在事件处理程序中使用事件中的字段告诉您哪个小部件被触发并获得指向它的指针。

【讨论】:

多路复用信号处理很容易通过 QSignalMapper 完成(注意:信号,而不是事件)。然而,对属性做同样的事情需要某种枚举。想想“清除所有”类型的操作——其中的槽在哪里? 好的 - 如果您想启用或填充小部件列表,那么指针向量可能是一个很好的解决方案。遍历它们以查看没有按下哪个。

以上是关于可枚举的 Qt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

具有重叠子小部件的 Qt 自定义小部件

Qt - QScrollArea 小部件剪辑内容

Qt 中简单的无键盘触摸屏小部件

如何在 Qt C++ 应用程序中显示具有大量小部件的可滚动列表作为项目?

Qt 设计器和 Dock 小部件

Qt - 重新加载小部件内容