Russian Qt Forum

Qt => Вопросы новичков => Тема начата: backdoor от Июнь 08, 2013, 21:25



Название: изучаю ООП
Отправлено: backdoor от Июнь 08, 2013, 21:25
Всем привет! Очередной раз холеось бы проконсультироваться по ошибкам) Ситуация простая, наследуем класс от QWidget и создаем просто один объект. Объясните, пожалуйста, новичку, что да как? Исходники и ошибки:

processor.h
Код:
#ifndef PROCESSOR_H
#define PROCESSOR_H

#include <QWidget>

class Processor : public QWidget
{
    Q_OBJECT

public:
    Processor(QWidget *parent = 0);

private slots:
    void alert();
};

#endif // PROCESSOR_H

processor.cpp
Код:
#include "processor.h"
#include <QtDebug>
#include <QtGui>
Processor::Processor(QWidget *parent):
    QWidget(parent)
{
}

void Processor::alert()
{
    qDebug() << "alert!!";
}

main.cpp
Код:
#include <QApplication>
#include "mainwindow.h"
#include "processor.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    Processor proc1;
    return a.exec();
}

processor.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const * __thiscall Processor::metaObject(void)const " (?metaObject@Processor@@UBEPBUQMetaObject@@XZ)"

processor.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual void * __thiscall Processor::qt_metacast(char const *)" (?qt_metacast@Processor@@UAEPAXPBD@Z)"

processor.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall Processor::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Processor@@UAEHW4Call@QMetaObject@@HPAPAX@Z)"


Название: Re: изучаю ООП
Отправлено: mutineer от Июнь 08, 2013, 22:02
Такое ощущение что moc не обработал твой файл processor.cpp перед компиляцией


Название: Re: изучаю ООП
Отправлено: lit-uriy от Июнь 09, 2013, 02:45
возможно макрос Q_OBJECT был написан не сразу, и первая компиляция пошла без него. Затем макрос добавлен, но qmake  не вызывался, соответственно и moc не знает, что нужно обработать файл processor.h

Ещё вариант, в pro-файле не указан processor.h в переменной HEADERS


Название: Re: изучаю ООП
Отправлено: backdoor от Июнь 09, 2013, 11:39
все верно, подправил, пересохранил - заработало. Спасибо. Подскажите вот еще что, как обращаться к элементам окна через ui-> из других файлов. просто подключить mainwindow.h не помогает:

mainwindow.h
Код:
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
   
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
   
public:
    Ui::MainWindow *ui;
};

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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


Название: Re: изучаю ООП
Отправлено: kambala от Июнь 09, 2013, 11:53
передавать указатель на MainWindow или нужные компоненты в другие классы


Название: Re: изучаю ООП
Отправлено: backdoor от Июнь 09, 2013, 12:03
передавать указатель на MainWindow или нужные компоненты в другие классы

а можно пример какой-нибудь?


Название: Re: изучаю ООП
Отправлено: mutineer от Июнь 09, 2013, 12:12
Код
C++ (Qt)
MainWindow *w = new MainWindow();
SomeFunction(w);
...
void SomeFunction(MainWindow* window)
{
   ...
   window->ui
   ...
}
 


Название: Re: изучаю ООП
Отправлено: lit-uriy от Июнь 09, 2013, 16:04
>>как обращаться к элементам окна через ui-> из других файлов
а на практике это не нужно.


Название: Re: изучаю ООП
Отправлено: Igors от Июнь 10, 2013, 09:45
>>как обращаться к элементам окна через ui-> из других файлов
а на практике это не нужно.
Точнее это идет вразрез с принципами изучаемого ООП. Грамотно обращаться к др окну используя сигналы и/или события, а не лазить "напрямую" в потрохах др класса


Название: Re: изучаю ООП
Отправлено: lit-uriy от Июнь 10, 2013, 13:48
Igors, я даже другое имел в виду, не сигналы-слоты, а проще (для новичков).

Зачем кому-то понадобилось устанавливать, например, значение спинбокса у какого-то окна? Этот кто-то - источник данных, а окно - способ представить эти данные пользователю.
Почти все окошки программ ориентированны на конкретную специфику. Поэтому взаимодействие окошка с другим кодом должно подчинятся смысловой нагрузке данных.

Если, например, спинбокс отображает количество лампочек включеных в помещении, то окошку нужно сделать метод типа:
setLampCount(int acount)
и вызывать его из-за пределов окна