无法访问 Qt5 中对话框的成员

Posted

技术标签:

【中文标题】无法访问 Qt5 中对话框的成员【英文标题】:Cannot access members of a dialog box in Qt5 【发布时间】:2017-10-31 00:54:19 【问题描述】:

我正在尝试按照此处的 Qt5 Visual Studio 教程进行操作: http://doc.qt.io/qtvstools/qtvstools-getting-started.html

本教程制作了一个主窗口和一个弹出对话框。主窗口正在工作,当您单击主窗口上的“添加”按钮时,对话框将按原样显示。

在对话框中,有两个我想从中获取值的 QLineEdit 对象。但我似乎无法访问对话框的这些成员。

对话框窗口中的两个对象是“nameEdit”(突出显示)和“emailEdit”(在其下方):

我得到的错误: -“类‘AddDialog’没有成员‘nameEdit’。 -“类 'AddDialog' 没有成员 'emailEdit'

您知道我无法访问 AddDialog 类成员的原因是什么吗? 这是 AddressBook.cpp 文件(我的主窗口)。

#include "AddressBook.h"
#include "AddDialog.h"
#include "ui_AddDialog.h"

AddressBook::AddressBook(QWidget *parent)
    : QMainWindow(parent)

    ui.setupUi(this);


void AddressBook::on_addButton_clicked()

    AddDialog dialog(this);

    if (dialog.exec())
    
        QString name = dialog.nameEdit->text();
        QString email = dialog.emailEdit->text();

        if (!name.isEmpty() && !email.isEmpty())
        
            QListWidgetItem *item = new QListWidgetItem(name, ui.addressList);
            item->setData(Qt::UserRole, email);
            ui.addressList->setCurrentItem(item);
        
    


void AddressBook::on_addressList_currentItemChanged()

    QListWidgetItem *curItem = ui.addressList->currentItem();

    if (curItem) 
        ui.nameLabel->setText("Name: " + curItem->text());
        ui.emailLabel->setText("Email: " + curItem->data(Qt::UserRole).toString());
    
    else 
        ui.nameLabel->setText("<No item selected>");
        ui.emailLabel->clear();
    


AddDialog.h(对话框):

    #include <QDialog>
    #include "ui_AddDialog.h"

    class AddDialog : public QDialog
    
        Q_OBJECT

    public:
        AddDialog(QWidget *parent = Q_NULLPTR);
        ~AddDialog();

    private:
        Ui::AddDialog ui;
    ;

和AddDialog.cpp(对话框):

#include "AddDialog.h"   
AddDialog::AddDialog(QWidget *parent)
    : QDialog(parent)

    ui.setupUi(this);

我试图只复制我认为与问题相关的代码,但以防万一,如果需要,这里是其他所有内容: https://github.com/davek99/DK-QT_Address_Book/

【问题讨论】:

【参考方案1】:

我得到的错误:

-“类'AddDialog'没有成员'nameEdit'

-“类'AddDialog'没有成员'emailEdit'

所以编译器告诉你 AddDialog 类中没有成员“nameEdit”或“emailEdit”。

所以,如果你看一下 AddDialog 类头文件,你会发现只有一个声明的类成员,“Ui::AddDialog ui”。

因此,您希望“nameEdit”和“emailEdit”也存在,但事实并非如此。那么他们在哪里呢?嗯,它们在 Ui::AddDialog 类中。

因此,如果您查看生成的 ui_AddDialog.h,您将看到“nameEdit”和“emailEdit”成员在该类中。

因此,为了从您的 AddDialog 类访问这两个成员,您需要在 AddDialog 中使访问器函数可用,以从包含的 Ui::AddDialog 类引用它们。

例如:

QString AddDialog::name() 
    return ui.nameEdit->text();

因此,当您在 AddressBook 类中使用 AddDialog 时,您可以简单地调用 dialog.name()。

我希望这很清楚,如果你不明白任何部分,请告诉我。

【讨论】:

以上是关于无法访问 Qt5 中对话框的成员的主要内容,如果未能解决你的问题,请参考以下文章

在派生类中无法访问受保护的成员

静态成员函数无法访问类的受保护成员

查找“无法访问在类'QObject'中声明的私有成员”的根本原因

无法访问受保护的成员[重复]

无法在构造函数中访问类的继承成员

无法访问在类“CObject”中声明的私有成员?