Как получить доступ к виджетам, созданным внутри функций, в последующих вызовах функций в Qt - PullRequest
0 голосов
/ 18 февраля 2011

Так что в настоящее время у меня есть код на C ++, который создает несколько QLabels, QLineEdit и QCheckBox, когда выбор сделан из QComboBox. Однако я хотел бы иметь возможность получить доступ к виджетам, которые я создал в более поздней функции, чтобы уничтожить их, если будет сделан новый выбор из поля со списком. Я могу получить доступ к объектам, созданным с помощью конструктора, выполнив команду ui -> Object , но не могу сделать это с объектами, созданными с помощью моего собственного кода. Могу ли я сделать это как-нибудь, потому что я знаю, как с этим работать.

Короче говоря, я хотел бы иметь возможность динамически создавать / уничтожать QWidgets на основе выбора, сделанного пользователем. Есть ли ссылка, о которой мне следует знать, или какая-либо документация? Или я просто совершенно ошибаюсь? Вот код, который у меня есть для создания объектов:

   if (eventType == QString::fromStdString("Birthday"))
   {

   QLabel *label1 = new QLabel ("Celebrant: ");
   QLabel *label2 = new QLabel ("Surprise: ");
   QLineEdit *lineEdit = new QLineEdit;
   QCheckBox *box = new QCheckBox;

   ui->gridLayout->addWidget(label1,3,0,1,1, 0);
   ui->gridLayout->addWidget(label2,4,0,1,1,0);
   ui->gridLayout->addWidget(lineEdit,3,1,1,1,0);
   ui->gridLayout->addWidget(box,4,1,1,2,0);

   }

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Если вы дадите им имена (используя setObjectName()), вы сможете найти их позже, используя QObject::findChildren().

Но не проще ли будет хранить их в переменных-членах?

2 голосов
/ 18 февраля 2011

Ну, вам нужно создать переменную в области видимости, доступную из всех частей кода, где вы хотите получить к ним доступ. Скорее всего, как личные атрибуты вашего оконного класса.

1 голос
/ 18 февраля 2011

Из кода, который вы разместили, похоже, что вы хотите заменить существующий виджет в позиции макета сетки. Если это так, перед добавлением нового виджета в позицию сделайте следующее:

QLayoutItem * existingitem = ui->gridLayout->itemAtPosition(x, y);
if(existingitem) {
    ui->gridLayout->removeItem(existingitem);
    delete existingitem;
}
...