5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
1

Доступ к ui из другого класса

18.04.2015, 15:09. Показов 9700. Ответов 14
Метки нет (Все метки)

Доброй ночи.

Ребята, данные вопросы уже поднимались на форуме. Подобные темы не помогли. Вопрос наверное больше по cpp, а не qt.
Не могу получить доступ к ui класса MainWindow, из класса faceDetect (конкретно в примере метод int startDetect).
Так как указатель ui находится в private.
Компилятор не ругается, только если указатель ui запихнуть в public. Но по итогу строка не передаётся в элемент все равно.


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//--------------mainWindows.h------------------------//
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QString dir;        //выбранный каталог
    QStringList list;   //files in catalog
    
 
 
private:
    Ui::MainWindow *ui;
 
//-------------------------------------------------//
 
//---------------faceDetect.h----------------------//
 
#include "LuxandFaceSDK.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
class faceDetect:public MainWindow
{
 
public:
 
    int InitializeLib();
    int startDetect(QStringList &Stringlist, QString &Dirfolder);
 
};
 
//---------------------------------------------//
 
//-----------------mainwindow.cpp-------------------//
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "faceDetect.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   
}
 
/*
приватные слоты
*/
 
//=======================================//
 
//---------------faceDetect.cpp-------------------------//
#include "faceDetect.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
 
 
int faceDetect::startDetect(QStringList &Stringlist, QString &Dirfolder)
{
//компилятор не ругается, только если указатель ui запихнуть в public. Но по итогу строка не передаётся в элемент все равно.
ui->textEdit_2->append("Start face detection...\n");
 
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2015, 15:09
Ответы с готовыми решениями:

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в...

Доступ к полям класса через переменные другого класса
Уважаемые коллеги! Почему в моделях Аnylogic для упрощения доступа к полям одного класса (класс А)...

MFC, доступ к элементу класса (StatusBar) из другого класса
Здравствуйте. Я новичок и нигде не смог найти ответ на следующий видимо простой вопрос. Подскажите,...

Доступ к свойствам экземпляра класса из другого класса
Здравствуйте! У меня возникла программа с написанием программы на C#. "Реализовать набор классов,...

14
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
18.04.2015, 17:20 2
заместо private: сделать protected:

C++ (Qt)
1
ui->textEdit_2->setText("Start face detection...\n");
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
18.04.2015, 17:39  [ТС] 3
Не помогло. По-прежнему возможно обращаться из методов класса MainWindow:

C++ (Qt)
1
2
3
4
5
6
//---------------mainwindow.cpp-----------------//
 
int MainWindow::on_fd_startDetect_clicked()
{
ui->textEdit_2->setText("ok\n\n");
}
Но невозможно из методов класса faceDetect.
"Засунул указатель в protected и заодно наследование для faceDetect изменил тоже с public на protected"
Но все бесполезно.

C++ (Qt)
1
2
3
4
5
//----------------faceDetect.h------------//
 
class faceDetect : protected MainWindow
{
};
0
3 / 3 / 1
Регистрация: 24.08.2013
Сообщений: 63
18.04.2015, 19:29 4
Реализуй все с помощью сигналов и слотов. В faceDetect вызываешь сигнал, а в Main прив"язываешь к нему слот.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
18.04.2015, 20:29  [ТС] 5
rokiss33, пример такого сигнала можно?
0
3 / 3 / 1
Регистрация: 24.08.2013
Сообщений: 63
19.04.2015, 14:38 6
Цитата Сообщение от Maxfashko Посмотреть сообщение
rokiss33, пример такого сигнала можно?
в отделе signals описания класса создаешь сигнал:
C++ (Qt)
1
void singnalExample(QString str)// я так понимаю тебе надо строку передать
там, где тебе надо передать текст вызываешь:
C++ (Qt)
1
emit singnalExample("Нужный текст")
Теперь в конструкторе класса Main конектим сигнал к слоту:
C++ (Qt)
1
2
faceDetect *obj = new faceDetect();
connect(obj, SIGNAL(singnalExample(QString)), this, SLOT(someSlot(QString)))
Создаешь слот someSlot, где у тебя есть доступ к ui, там все и делаешь
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
19.04.2015, 14:38  [ТС] 7
Парни, засада... Выручайте.
0
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
19.04.2015, 15:01 8
Как? вам все сказали.

Если вы хотите получить доступ к переменной класса из наследника то объявляйте переменную в базовом классе под protected: если у вас это не работает то, только вы можете знать почему и где вы накосячили в вашем коде.

Далее: конкретно в вашем случае (по тому коду , что я вижу) я думаю сигналы/слоты излишне, хотя все зависит от архитектуры программы и реально в вашем проекте может быть правильнее делать через сигнал слоты, но только вам это может быть известно.

Далее: Для работы с QTextEdit читайте документацию по QT.

Далее: Для работы с Сигнал/Слотами читайте документацию по QT.

Далее: ни одного кода ошибки вы не привели, вы уверены, что вы правильно интерпретировали ошибки и пересказали их нам?

PS Мало кому нравится "Ванговать".
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
19.04.2015, 15:41  [ТС] 9
Pancir, сообщение улетело до того, как увидел ответ!rokiss33 Благодарю за ответ.

Добавлено через 3 минуты
Pancir, Кстати, ошибок не было. Вообще никакой реакции, при объявлении указателя в protected или public. При обращении к указателю ui, когда он объявлен в private - понятное дело, будут ошибки на стадии компиляции.
0
58 / 45 / 11
Регистрация: 16.09.2014
Сообщений: 124
19.04.2015, 15:46 10
Цитата Сообщение от Maxfashko Посмотреть сообщение
Вообще никакой реакции, при объявлении указателя в protected или public.
И не будет, тк с точки зрения наследника нет никакой разницы.

private - разрешает доступ к переменной класса только классу в котором она объявлена.
protected - разрешает доступ к переменной класса, классу в котором она объявлена и его наследникам.
public - разрешает любому классу доступ к переменной.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
19.04.2015, 16:01  [ТС] 11
rokiss33,
в отделе signals описания класса создаешь сигнал:
Код C++ (QT)
1
void singnalExample(QString str)// я так понимаю тебе надо строку передать
там, где тебе надо передать текст вызываешь:
Код C++ (QT)
1
emit singnalExample("Нужный текст")
Теперь в конструкторе класса Main конектим сигнал к слоту:
Код C++ (QT)
1
2
faceDetect *obj = new faceDetect();
connect(obj, SIGNAL(singnalExample(QString)), this, SLOT(someSlot(QString)))
Создаешь слот someSlot, где у тебя есть доступ к ui, там все и делаешь
при проделанных операциях программа вылетает на стадии запуска.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//--------------mainwindow.h---------------------//
 
//добавил слот и сигнал
 
public slots:
   void someSlot(QString str);
 
signals:
    void singnalExample(QString str);
 
//======================================//
 
//------------mainwindow.cpp--------------------//
 
//коннект сигнала
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    faceDetect *obj = new faceDetect();
    connect(obj, SIGNAL(singnalExample(QString)), this, SLOT(someSlot(QString)));
    ui->setupUi(this);
 
}
 
 
//создаем слот
 
void MainWindow::someSlot(QString str){
    ui->textEdit_2->append(str);
}
 
//==============================//
 
//-------------faceDetect.cpp-----------//
 
//в любом методе класса faceDetect выполняем код:
emit singnalExample("111");
Может, руки кривые?
0
3 / 3 / 1
Регистрация: 24.08.2013
Сообщений: 63
19.04.2015, 16:52 12
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

C++ (Qt)
1
2
3
    faceDetect *obj = new faceDetect();
    connect(obj, SIGNAL(singnalExample(QString)), this, SLOT(someSlot(QString)));
    ui->setupUi(this);
Здесь я б setupUi не перемещал вниз, может наделать много траблов:
C++ (Qt)
1
2
3
    ui->setupUi(this);
    faceDetect *obj = new faceDetect();
    connect(obj, SIGNAL(singnalExample(QString)), this, SLOT(someSlot(QString)));
Сигнал создавай в "faceDetect.h"
C++ (Qt)
1
2
signals:
    void singnalExample(QString str);
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
19.04.2015, 17:23  [ТС] 13
Цитата Сообщение от rokiss33 Посмотреть сообщение
Сигнал создавай в "faceDetect.h"

C++ (Qt)
1
2
signals:
    void singnalExample(QString str);
При этом действии компилятор ругается на неопределенную ссылку на faceDetect::singnalExample(QString)
" undefined reference to `faceDetect::singnalExample(QString)' "

Добавлено через 9 минут
Ошибка соответственно при :

C++ (Qt)
1
emit singnalExample("text");
В методе класса faceDetect
0
3 / 3 / 1
Регистрация: 24.08.2013
Сообщений: 63
19.04.2015, 17:38 14
кинь весь код
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
19.04.2015, 17:44  [ТС] 15
rokiss33, Лс.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2015, 17:44

Доступ к элементам и методам класса из другого класса
Пишу и понимаю, что создаю, наверняка, давно избитую тему, но вот уже второй день пытаюсь найти...

Доступ к ui из другого класса
Добрый день! Отупел в край, выручайте)) Пролапатил кучу тем, все вода и срач. Вообщем есть форма,...

Доступ к контроллу из другого класса
Понимаю что тема заезжанная, но я так и не понял какой способ лучше, работает хорошо и не нарушает...

доступ к массиву из другого класса
Всем привет. Чета не пойму как сделать такое: есть класс Form1.cs(при создании), добавил новый...

Доступ к контролу из другого класса
Всем привет. Что-то я адцки туплю и не могу сотворить простую вещь. Есть форма. На форме есть...

Доступ к объектам из другого класса
ДД! В одном классе есть двумерный массив кнопок, унаследованных от QPushButton. Есть другой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.