如何在 Qt 的后续函数调用中访问在函数中创建的小部件

Posted

技术标签:

【中文标题】如何在 Qt 的后续函数调用中访问在函数中创建的小部件【英文标题】:How to access widgets created within functions in later function calls in Qt 【发布时间】:2011-02-17 22:20:54 【问题描述】:

所以目前我有代码,在 C++ 中,当从 QComboBox 进行选择时,它会创建一些 QLabels、一个 QLineEdit 和一个 QCheckBox。但是,如果从组合框中进行了新的选择,我希望能够访问我在以后的函数中创建的小部件以销毁它们。我可以通过执行 ui->Object 访问使用设计器创建的对象,但我无法使用我自己的代码创建的对象来执行此操作。我可以这样做吗,因为我知道如何使用它。

简而言之,我希望能够根据用户所做的选择动态地创建/销毁 QWidget。是否有我应该知道的参考资料或任何文档?还是我只是完全以错误的方式解决这个问题?这是我目前用于创建对象的代码:

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

   

【问题讨论】:

【参考方案1】:

如果你给他们起名字(使用setObjectName()),你以后可以使用QObject::findChildren()找到他们。

但是将它们存储在成员变量中不是更容易吗?

【讨论】:

这是一个想法,但如果我这样做,就会有无数的变数。我的意思是,我可以这样做,我只是不确定这是否是好的做法。 好的,然后使用命名和findChildren()。这不是太难,而且给你很好的灵活性。【参考方案2】:

好吧,您需要在一个范围内创建变量,该范围可从您想要访问它们的代码的所有部分访问。最有可能作为窗口类的私有属性。

【讨论】:

【参考方案3】:

从您发布的代码来看,您似乎想要替换网格布局位置中的现有小部件。如果是这种情况,在将新小部件添加到该位置之前,请执行以下操作:

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

【讨论】:

以上是关于如何在 Qt 的后续函数调用中访问在函数中创建的小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 的另一个函数中调用我在 VBA 中创建的函数?

你如何调用在javascript中的数组中创建的对象的函数?

如何使用 Javascript 访问用户在 Facebook API 中创建的事件?

QT QML - 从另一个类访问 qml 模型

如何访问在 QtCreator Designer 中创建的 QLabel?

函数事件(onChange)中的调用函数,来自在 Leaflet 和 Vue.js 中创建的 Select