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

时间:2017-10-31 00:54:19

标签: c++ visual-studio qt dialog qt5

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

本教程创建一个主窗口和一个弹出对话框。主窗口正在工作,当您单击"添加"时,将显示对话框。主窗口上的按钮。

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

对话窗口中的两个对象是" nameEdit" (突出显示)和" emailEdit" (在它下面): Dialog Window Objects

我得到的错误:
   - " class' AddDialog'没有会员&name; nameEdit'。
   - " class' AddDialog'没有会员' emailEdit'

您能看到我无法访问AddDialog类成员的原因是什么?

这是AddressBook.cpp文件(我的主窗口)。

Heroku

AddDialog.h(对话框):

#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.cpp(对话框):

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

    class AddDialog : public QDialog
    {
        Q_OBJECT

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

    private:
        Ui::AddDialog ui;
    };

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

1 个答案:

答案 0 :(得分:1)

  

我得到的错误:

     

- &#34; class&#39; AddDialog&#39;没有会员名称编辑&#39;

     

- &#34; class&#39; AddDialog&#39;没有会员&#39; emailEdit&#39;

所以编译器告诉你没有成员&#34; nameEdit&#34;或&#34; emailEdit&#34;在你的AddDialog类中。

因此,如果您查看AddDialog类头文件,您可以看到只声明了一个类成员,&#34; Ui :: AddDialog ui&#34;。

所以你期待&#34; nameEdit&#34;和&#34; emailEdit&#34;在那里,但他们不是。那他们在哪儿?好吧,它们在Ui :: AddDialog类中。

所以,如果你看看生成的ui_AddDialog.h,你会看到&#34; nameEdit&#34;和&#34; emailEdit&#34;成员都在那个班级。

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

例如:

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

那么当您在AddressBook类中使用AddDialog时,您只需调用dialog.name()。

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