[C++/Qt] not declared in this scope aplikacja oparta o QMainWindow

0

Witam,
Stawiam pierwsze kroki w Qt 4. Utworzyłem projekt, dodałem widgety do .ui (podałem fragment) w pliku automatycznie generowanym pojawiło się coś takiego:


#ifndef UI_ADDRESSBOOK_H
#define UI_ADDRESSBOOK_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QTextEdit>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_AddressBook
{
public:
    QWidget *centralWidget;
    QWidget *widget;
    QGridLayout *gridLayout;
    QLabel *nameLabel;
    QLineEdit *nameLine;
    QLabel *addressLabel;
    QTextEdit *addressEdit;
    QWidget *widget1;
    QGridLayout *gridLayout_2;
    QPushButton *addButton;
    QPushButton *submitButton;
    QPushButton *cancelButton;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *AddressBook)
    {
        if (AddressBook->objectName().isEmpty())
            AddressBook->setObjectName(QString::fromUtf8("AddressBook"));
        AddressBook->resize(409, 344);
        centralWidget = new QWidget(AddressBook);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        widget = new QWidget(centralWidget);
        widget->setObjectName(QString::fromUtf8("widget"));

Tego się spodziewałem. Następnie próbuje utworzyć elementarną operację - w konstuktorze klasy AddressBook chcę nakazać przełączenie nameLine oraz addressEdit w tryb tylko do odczytu.

W tym celu zmieniam kod w addressbook.cpp (fragment):

#include "addressbook.h"
#include "ui_addressbook.h"

AddressBook::AddressBook(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::AddressBook)
{
// dopisane
    nameLine->setReadOnly(true);
    addressEdit->setReadOnly(true);
// end dopisane
    ui->setupUi(this);
}

Tak wygląda plik nagłówkowy klasy głównej:

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H

#include <QMainWindow>
#include <QMap> // for containter to store data
#include <QMessageBox>
#include "ui_addressbook.h"

namespace Ui {
    class AddressBook;
}

class AddressBook : public QMainWindow {
    Q_OBJECT
    // defined values
    QMap<QString, QString> contacts;
    QString oldName;
    QString oldAddress;
public:
    AddressBook(QWidget *parent = 0);
    ~AddressBook();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::AddressBook *ui;

private slots:
    void addContact();
    void submitContact();
    void cancel();
};

#endif // ADDRESSBOOK_H

Otrzymuje komunikat błędu podany w tytule:
/home/margor/AddressBook/addressbook.cpp error: ‘nameLine’ was not declared in this scope
/home/margor/AddressBook/addressbook.cpp error: ‘addressEdit’ was not declared in this scope

Nie rozumiem dlaczego widgety dodane do .ui są niewidoczne. Są publiczne, plik ui_klasa.h jest dołączony. Pewnie chodzi o przestrzeń nazw (sprawdziłem mając świadomość, że to nie będą te przestrzenie nazw Ui i Qt). Jestem bardzo początkujący, pewnie jest to w dokumentacji, którą teraz przeglądam.

Dziękuje za zwrócenie uwagi na mój pewnie bardzo prosty i głupi problem.

0

Spróbuj

AddressBook::AddressBook(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::AddressBook)
{
    ui->setupUi(this);
// dopisane
    nameLine->setReadOnly(true);
    addressEdit->setReadOnly(true);
// end dopisane
}
 

Czyli to "dopisane" dać po setupUi.

0

Nie pomaga (wcześniej też tego próbowałem). Dodatkowo zrobiłem wyczyść wszystko, bez efektu.

0

Przebudowałeś cały projekt po dokonaniu tych zmian? setupUI musi być pierwsze w konstruktorze potem możesz się odwoływać więc pozostaw tak.

0

Tak, zgodnie z logiką ta komenda musi być najpierw, bo inaczej nie zaalokuje pamięci na te obiekty. Najpierw wszedłem do katalogu z projektem i wrzuciłem profilaktycznie make clean.

Komunikaty po wykonaniu CTRL+SHIFT+B, czyli zbuduj wszystko w QtCreator.

Uruchamianie kroków budowania dla projektu AddressBook...
Konfiguracja nie została zmieniona, opuszczono krok QMake.
Uruchamianie: /usr/bin/make -w 
make: Wejście do katalogu `/home/margor/AddressBook'
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I. -I. -o addressbook.o addressbook.cpp
addressbook.cpp: In constructor ‘AddressBook::AddressBook(QWidget*)’:
addressbook.cpp:9:5: error: ‘nameLine’ was not declared in this scope
addressbook.cpp:10:5: error: ‘addressEdit’ was not declared in this scope
make: Opuszczenie katalogu `/home/margor/AddressBook'
make: *** [addressbook.o] Błąd 1
Zakończono kodem wyjściowym 2.
Błąd podczas budowania projektu AddressBook
Podczas wykonywania kroku budowania "Make"

Pewnie zabrałem się za całość od złej strony. Teraz powinienem szukać howto jak zabrać się za projekt oparty o MainWindow.

Wrzucę na wszelki wypadek:
addressbook.h

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H

#include <QMainWindow>
#include <QMap> // for containter to store data
#include <QMessageBox>
#include "ui_addressbook.h"

namespace Ui {
    class AddressBook;
}

class AddressBook : public QMainWindow {
    Q_OBJECT
    // defined values
    QMap<QString, QString> contacts;
    QString oldName;
    QString oldAddress;
public:
    AddressBook(QWidget *parent = 0);
    ~AddressBook();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::AddressBook *ui;

private slots:
    void addContact();
    void submitContact();
    void cancel();
};

#endif // ADDRESSBOOK_H

addressbook.cpp

#include "addressbook.h"
#include "ui_addressbook.h"

AddressBook::AddressBook(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::AddressBook)
{
    nameLine->setReadOnly(true);
    addressEdit->setReadOnly(true);
    ui->setupUi(this);
}

AddressBook::~AddressBook()
{
    delete ui;
}

void AddressBook::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}


void AddressBook::addContact()
{
}

void AddressBook::submitContact()
{
}

void AddressBook::cancel()
{

}

main.cpp

#include <QtGui/QApplication>
#include "addressbook.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    AddressBook w;
    w.show();
    return a.exec();
}

ui_addressbook.h

/********************************************************************************
** Form generated from reading UI file 'addressbook.ui'
**
** Created
**      by: Qt User Interface Compiler version 4.6.3
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_ADDRESSBOOK_H
#define UI_ADDRESSBOOK_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QTextEdit>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_AddressBook
{
public:
    QWidget *centralWidget;
    QWidget *widget;
    QGridLayout *gridLayout;
    QLabel *nameLabel;
    QLineEdit *nameLine;
    QLabel *addressLabel;
    QTextEdit *addressEdit;
    QWidget *widget1;
    QGridLayout *gridLayout_2;
    QPushButton *addButton;
    QPushButton *submitButton;
    QPushButton *cancelButton;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *AddressBook)
    {
        if (AddressBook->objectName().isEmpty())
            AddressBook->setObjectName(QString::fromUtf8("AddressBook"));
        AddressBook->resize(409, 344);
        centralWidget = new QWidget(AddressBook);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        widget = new QWidget(centralWidget);
        widget->setObjectName(QString::fromUtf8("widget"));
        widget->setGeometry(QRect(10, 0, 311, 222));
        gridLayout = new QGridLayout(widget);
        gridLayout->setSpacing(6);
        gridLayout->setContentsMargins(11, 11, 11, 11);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        gridLayout->setContentsMargins(0, 0, 0, 0);
        nameLabel = new QLabel(widget);
        nameLabel->setObjectName(QString::fromUtf8("nameLabel"));

        gridLayout->addWidget(nameLabel, 0, 0, 1, 1);

        nameLine = new QLineEdit(widget);
        nameLine->setObjectName(QString::fromUtf8("nameLine"));

        gridLayout->addWidget(nameLine, 0, 1, 1, 1);

        addressLabel = new QLabel(widget);
        addressLabel->setObjectName(QString::fromUtf8("addressLabel"));

        gridLayout->addWidget(addressLabel, 1, 0, 1, 1);

        addressEdit = new QTextEdit(widget);
        addressEdit->setObjectName(QString::fromUtf8("addressEdit"));

        gridLayout->addWidget(addressEdit, 1, 1, 1, 1);

        widget1 = new QWidget(centralWidget);
        widget1->setObjectName(QString::fromUtf8("widget1"));
        widget1->setGeometry(QRect(330, 30, 73, 79));
        gridLayout_2 = new QGridLayout(widget1);
        gridLayout_2->setSpacing(6);
        gridLayout_2->setContentsMargins(11, 11, 11, 11);
        gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
        gridLayout_2->setContentsMargins(0, 0, 0, 0);
        addButton = new QPushButton(widget1);
        addButton->setObjectName(QString::fromUtf8("addButton"));

        gridLayout_2->addWidget(addButton, 0, 0, 1, 1);

        submitButton = new QPushButton(widget1);
        submitButton->setObjectName(QString::fromUtf8("submitButton"));

        gridLayout_2->addWidget(submitButton, 1, 0, 1, 1);

        cancelButton = new QPushButton(widget1);
        cancelButton->setObjectName(QString::fromUtf8("cancelButton"));

        gridLayout_2->addWidget(cancelButton, 2, 0, 1, 1);

        AddressBook->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(AddressBook);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 409, 20));
        AddressBook->setMenuBar(menuBar);
        mainToolBar = new QToolBar(AddressBook);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        AddressBook->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(AddressBook);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        AddressBook->setStatusBar(statusBar);

        retranslateUi(AddressBook);

        QMetaObject::connectSlotsByName(AddressBook);
    } // setupUi

    void retranslateUi(QMainWindow *AddressBook)
    {
        AddressBook->setWindowTitle(QApplication::translate("AddressBook", "AddressBook", 0, QApplication::UnicodeUTF8));
        nameLabel->setText(QApplication::translate("AddressBook", "Name:", 0, QApplication::UnicodeUTF8));
        addressLabel->setText(QApplication::translate("AddressBook", "Address:", 0, QApplication::UnicodeUTF8));
        addButton->setText(QApplication::translate("AddressBook", "Add", 0, QApplication::UnicodeUTF8));
        submitButton->setText(QApplication::translate("AddressBook", "Submit", 0, QApplication::UnicodeUTF8));
        cancelButton->setText(QApplication::translate("AddressBook", "Cancel", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class AddressBook: public Ui_AddressBook {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_ADDRESSBOOK_H

0

Nie

nameLine

, ale ui->nameLine

, analogicznie reszta elementów. Widgety wygenerowane automatycznie są składowymi obiektu klasy Ui_AddressBook, nie głównego okna. Ponieważ trzymasz wskaźnik do ui w składowej klasy AddressBook która nie dziedziczy po Ui_AddressBook, odwołuj się do widgetów przez ten wskaźnik.
0

To mogłem już sam się domyślić. wstyd Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1