从QWidget获取对象名称(在Qt Designer中可见)?

6

我希望在我的Qt应用程序中禁用除了一组选定的部件之外的所有部件。

我的目标是使用findChildren迭代mainWindow的所有子元素,并使用setEnabled(false)禁用所有结果部件,除了'myTable'。

QList<QWidget *> allWidgets = mainWindow->findChildren<QWidget *>("");
QList<QWidget*>::iterator it;
for (it = allWidgets.begin(); it != allWidgets.end(); it++) {
    if ((*it)->objectName() != "myTable")  // here, objectName is not working!!
    {
        (*it)->setEnabled(false);
    } 
}

在上述的if语句中,objectName()不起作用。我该在那里放什么?
3个回答

6
objectName函数不返回类名或变量名,而是返回您使用QObject::setObjectName设置的实际对象名称。因此,您需要先在表格中设置它:
myTable->setObjectName("myTable");

正如 SingerOfTheFall 所建议的那样,在我的情况下禁用所有小部件并启用我想要的小部件更容易。但还是谢谢。 - fortytwo

2
你可以使用accessibleName属性。为你需要的小部件设置它,然后在循环中使用accessibleName()函数进行检查。默认情况下,它是一个空字符串,所以应该很容易找到你的小部件。
另一种选择是禁用所有小部件,然后直接启用你需要的那个:
for( QWidget * w : widgets )
{
    w->setEnabled(false);
}

ui->myTable->setEnabled(true);

最后,您可以使用setObjectName()函数设置objectName属性,并在代码中使用它。


谢谢。我实际上禁用了所有小部件并启用了我想要的那个。 - fortytwo
请在Qt代码中使用foreach,而不是仅限于C++11的功能。这就是为什么foreach仍然存在的原因,因为Qt必须在目前这个时间点与早期的C++11编译器一起工作。 - László Papp
@lpapp,我非常怀疑C++仅仅为了一个第三方库而保留了“foreach”。用户可以使用他们想要的任何C++方言进行编程;他们不必支持11年之前的编译器。此外,即使在2012年,在您发布之前,Qt也在其内部使用C++11功能:http://woboq.com/blog/cpp11-in-qt5.html。我建议您停止将自己的编码意见当作每个人都必须遵守的事实来表达。 - underscore_d

2

在第一行写入以下内容(从括号中删除引号):

QList<QWidget *> allWidgets = mainWindow->findChildren<QWidget *>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接