Russian Qt Forum

Qt => Вопросы новичков => Тема начата: NezLich от Август 16, 2012, 16:55



Название: Обратится к компоненту из другого класса/файла
Отправлено: NezLich от Август 16, 2012, 16:55
Есть стандартный проект QT Widget.
Добавляю к нему пользовательский класс. И проблема в том, как обратится к компоненту из пользовательского класса.
В главной классе (MainWindow) к нему можно достучаться так: ui->component.
Пробовал объявлять в пользовательском классе "ui_mainwindow", но приложение крешется при обращении к компонентам...


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: Bepec от Август 16, 2012, 17:09
Код приведите пожалуйста .

А по делу - надо просто сделать его полем родительского класса. Ну или как вариант давать ему родителя :)


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: NezLich от Август 16, 2012, 17:31
Вот код test.h:
Код:
#ifndef TEST_H
#define TEST_H

#include <QMainWindow>
#include <ui_mainwindow.h>

class MainWindow;

class Test : public QMainWindow
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = 0);
    Ui_MainWindow Form;

signals:
   
public slots:


};

#endif // TEST_H

Код test.c:
Код:
#include "test.h"
#include "Mainwindow.h"
#include "ui_mainwindow.h"

Test::Test(QWidget *parent) :
    QMainWindow(parent)
{
    Form.FindButton->setVisible(false);
}


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: Bepec от Август 16, 2012, 17:44
Кхм. Очень странный у вас подход.

Обычно взаимодействие с ГУИ осуществляется через собственный интерфейс - сигналы, слоты.
Так, как сделали вы, я ещё ниразу не делал и не видел, кто бы делал :) Счас попробую сам :D


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: Bepec от Август 16, 2012, 17:49
Вы видимо по памяти писали на коленке.
h
Код:
#ifndef TMO_H
#define TMO_H

#include <QtGui/QMainWindow>
#include "ui_tmo.h"

class tmo : public QMainWindow
{
Q_OBJECT

public:
tmo(QWidget *parent = 0, Qt::WFlags flags = 0);
~tmo();

private:
Ui::tmoClass ui;
};

#endif // TMO_H
сpp
Код:
#include "tmo.h"

tmo::tmo(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
ui.label->setText("Olala");
}

tmo::~tmo()
{

}


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: NezLich от Август 16, 2012, 19:10
Что-то не получается... Вообще то да, через слоты, просто в одном классе реализовал слоты для работы с деревом.
Попробовал их в главном файле подключить слот, но не получается...


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: Bepec от Август 16, 2012, 19:11
На пустые слова можно ответить пустыми словами. А на неработающий проект можно ответить замечаниями и патчами.

PS это намёк. Начинали все.


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: NezLich от Август 16, 2012, 19:15
Собственно пока вот такой код, но не работает.
Mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "test.h"

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

    Test *treetest = new Test();

    QObject::connect(ui->TreeFiles,
                     SIGNAL(itemClicked(QTreeWidgetItem*,int)),
                     this,
                     SLOT(treetest->TreeClick(QTreeWidgetItem*,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}
test.h
Код:
#ifndef TEST_H
#define TEST_H

#include <QMainWindow>
#include <ui_mainwindow.h>

class MainWindow;

class Test : public QMainWindow
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = 0);

signals:
   
public slots:

    void TreeClick(QTreeWidgetItem *item, int column);

private:
    Ui::MainWindow ui;
};

#endif // TEST_H
test.cpp
Код:
#include "test.h"
#include "ui_mainwindow.h"
#include "QDebug"

Test::Test(QWidget *parent) :
    QMainWindow(parent)
{
    ui.setupUi(this);
}

void Test::TreeClick(QTreeWidgetItem *item, int column)
{
    QTreeWidgetItem *atem = new QTreeWidgetItem();

    atem->setText(0, "Test");

    ui.TreeFiles->addTopLevelItem(atem);
}


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: kambala от Август 16, 2012, 19:29
изучай сигналы-слоты:
QObject::connect(ui->TreeFiles,
                     SIGNAL(itemClicked(QTreeWidgetItem*,int)),
                     treetest,
                     SLOT(TreeClick(QTreeWidgetItem*,int)));


Название: Re: Обратится к компоненту из другого класса/файла
Отправлено: NezLich от Август 16, 2012, 19:42
изучай сигналы-слоты:
QObject::connect(ui->TreeFiles,
                     SIGNAL(itemClicked(QTreeWidgetItem*,int)),
                     treetest,
                     SLOT(TreeClick(QTreeWidgetItem*,int)));
К сожалению, не реагирует на клик :(
Извиняюсь, клик работает, но вот дерево не добавляет компонент...