Russian Qt Forum
Ноябрь 26, 2024, 08:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: изучаю ООП  (Прочитано 4520 раз)
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)"
Записан
mutineer
Гость
« Ответ #1 : Июнь 08, 2013, 22:02 »

Такое ощущение что moc не обработал твой файл processor.cpp перед компиляцией
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Июнь 09, 2013, 02:45 »

возможно макрос Q_OBJECT был написан не сразу, и первая компиляция пошла без него. Затем макрос добавлен, но qmake  не вызывался, соответственно и moc не знает, что нужно обработать файл processor.h

Ещё вариант, в pro-файле не указан processor.h в переменной HEADERS
« Последнее редактирование: Июнь 09, 2013, 02:47 от lit-uriy » Записан

Юра.
backdoor
Гость
« Ответ #3 : Июнь 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;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Июнь 09, 2013, 11:53 »

передавать указатель на MainWindow или нужные компоненты в другие классы
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
backdoor
Гость
« Ответ #5 : Июнь 09, 2013, 12:03 »

передавать указатель на MainWindow или нужные компоненты в другие классы

а можно пример какой-нибудь?
Записан
mutineer
Гость
« Ответ #6 : Июнь 09, 2013, 12:12 »

Код
C++ (Qt)
MainWindow *w = new MainWindow();
SomeFunction(w);
...
void SomeFunction(MainWindow* window)
{
   ...
   window->ui
   ...
}
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июнь 09, 2013, 16:04 »

>>как обращаться к элементам окна через ui-> из других файлов
а на практике это не нужно.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 10, 2013, 09:45 »

>>как обращаться к элементам окна через ui-> из других файлов
а на практике это не нужно.
Точнее это идет вразрез с принципами изучаемого ООП. Грамотно обращаться к др окну используя сигналы и/или события, а не лазить "напрямую" в потрохах др класса
« Последнее редактирование: Июнь 10, 2013, 15:01 от Igors » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 10, 2013, 13:48 »

Igors, я даже другое имел в виду, не сигналы-слоты, а проще (для новичков).

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

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

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 23.