Получить имя объекта (как видно из Qt Designer) из QWidget?

Я хочу отключить все, кроме выбранного набора виджетов в моем приложении Qt.

Я пытаюсь выполнить итерацию всех дочерних элементов mainWindow с помощью findChildren и отключить все полученные виджеты, кроме myTable, с помощью setEnabled(false).

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);
    } 
}

objectName() внутри приведенного выше оператора if не работает. Что я туда положил?


person fortytwo    schedule 26.11.2013    source источник


Ответы (3)


Вы можете использовать свойство accessibleName. Установите его для нужного вам виджета, а затем проверьте его в своем цикле функцией acessibleName(). По умолчанию это пустая строка, поэтому найти ваш виджет несложно.

Другой вариант — отключить все виджеты, а затем просто включить тот, который вам нужен напрямую:

for( QWidget * w : widgets )
{
    w->setEnabled(false);
}

ui->myTable->setEnabled(true);

Или, наконец, вы можете установить свойство objectName с помощью функции setObjectName() и использовать его в своем коде.

person SingerOfTheFall    schedule 26.11.2013
comment
Спасибо. На самом деле я отключил все виджеты и включил тот, который хочу. - person fortytwo; 26.11.2013
comment
Пожалуйста, используйте foreach в коде Qt, а не только функции C++11. Вот почему foreach все еще используется, потому что Qt на данный момент должен работать с компиляторами до C++11. - person lpapp; 26.12.2013
comment
@lpapp Я очень сомневаюсь, что C ++ поддерживает foreach только ради одной сторонней библиотеки. Пользователи могут программировать на любом диалекте C++, который они хотят; они не обязаны поддерживать компиляторы до 11. Кроме того, даже в 2012 году, до того, как вы написали, Qt использовал возможности C++11 внутри себя: woboq.com/blog/cpp11-in-qt5.html. Я предлагаю вам перестать излагать свои собственные мнения о кодировании, как если бы они были фактами, которым должны подчиняться все остальные. - person underscore_d; 11.12.2015

Функция objectName возвращает не имя класса или имя переменной, а фактическое имя объекта, которое вы установили с помощью QObject::setObjectName. Поэтому вам сначала нужно установить его в своей таблице с помощью:

myTable->setObjectName("myTable");
person Shoe    schedule 26.11.2013
comment
Как предложил SingerOfTheFall, в моем случае было проще отключить все виджеты и включить нужный. Но спасибо. - person fortytwo; 26.11.2013

Напишите это в первой строке (уберите кавычки из скобок):

QList<QWidget *> allWidgets = mainWindow->findChildren<QWidget *>();
person Paolo Nenna    schedule 17.11.2018