首页 > 解决方案 > 如何在 Qt 中循环控制多个小部件?

问题描述

在 MFC 中创建控件时(动态创建或使用 MFC 资源编辑器),每个控件都有一个唯一的资源 ID。因此,我在头文件中预定义了控件资源 ID,并GetDlgItem(int)在需要多个控件操作时在 for 循环中使用了函数。

这是 MFC 示例:

// ResourceID.h
#define IDC_BTN1 WM_USER + 101
#define IDC_BTN2 WM_USER + 102
#define IDC_BTN3 WM_USER + 103
...
#define IDC_BTN10 WM_USER + 110

// When getting the checked state of buttons 1 to 10
for(int i = IDC_BTN1; i <= IDC_BTN10; i++)
  ((CButton*)GetDlgItem(i))->GetCheck();

现在我想在 Qt 中做同样的事情(批量处理多个小部件)。我使用Qt Designer放置了 10 个按钮(不是动态创建的)。但是,Qt 只能通过类似的对象访问ui->pushButton,所以我无法通过循环控制多个小部件。

所以,我的问题是

  1. Qt小部件有可以顺序分配的ID,比如MFC的资源ID?
  2. 如何控制多个小部件?
  3. 我可以使用 QPushButton* 数组控制多个小部件,如下所示:
// in header 
QPushButton *btnArr[10];

// in constructor
btnArr[0] = ui->btn1;
btnArr[1] = ui->btn2;
...

// control multiple widgets
for(QPushButton *btn : btnArr)
  btn->hide();

它有效,但这是正确的方法吗?

标签: c++qt

解决方案


如果您的按钮在同一个父级中。您可以使用setObjectName方法来设置按钮的名称。

然后从父级,您可以使用findChild方法通过对象名称访问按钮。如果按钮名称在“button1”、“button2”之类的规则中......那么您可以轻松地循环访问按钮。


推荐阅读