Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Управление главным окном из дочернего

Автор: RazrFalcon 24.8.2011, 16:53

.h

#include "mainwindow.h"

class MainWindow;

class Preference : public QDialog, private Ui::Preference
{
  Q_OBJECT

public:
  Preference(MainWindow *main,QWidget *parent = 0);

private:
  MainWindow *mainWindow;

.cpp
Preference::Preference(MainWindow *main, QWidget *parent)
  : QDialog(parent)
{
  setupUi(this);

  mainWindow = main;
  mainWindow->table->hide();

ui_mainwindow.h:64: error: ‘QTableView* Ui_MainWindow::table’ is inaccessible


Как побороть?

Автор: Алексей1153 24.8.2011, 17:50

первый вопрос: как и где определено table
второй вопрос: зачем после #include "mainwindow.h" идет форвард class MainWindow;

Автор: RazrFalcon 24.8.2011, 22:06

1) mainwindow.ui + ui_mainwindiw.h
2) ХЗ <_<

Автор: silver47 25.8.2011, 5:35

Эм... мне в таких случаях помогает система сигналов-слотов. Главное окно создает дочернее и тут же прикручивает сигнал от дочернего к своему слоту. А по поводу

mainWindow->table->hide(); // нужно чтобы table был объявлен в секции public, что не есть хорошо.

Автор: RazrFalcon 1.9.2011, 21:31

А почему тогда если я сам пишу гуи, без дизайнера и ui, то я могу управлять главным окном из дочернего?

Автор: silver47 2.9.2011, 5:28

Цитата(RazrFalcon @ 2.9.2011, 0:31) *
А почему тогда если я сам пишу гуи, без дизайнера и ui, то я могу управлять главным окном из дочернего?


Не понял вопроса. Я всегда пишу гуи сам, без дизайнера.
class MyMainClass(...){
  QOBJECT
public:
  MyMainClass(...);
}

class MyChildClass(...){
  QOBJECT
  QTableWidget table;
public:
  MyChildClass(....)
}

//создание экземпляра MyChildClass где-то в недрах MyMainClass
MyChildClass myClass(this);
//попытка обратиться к приватному члену класса MyChildClass
myClass->table->hide(); // неудачно. 'QTableWidget MyChildClass::table' is private


решение:
переносить нужные Вам объекты в секцию public или воспользоваться сигналами слотами.

Автор: RazrFalcon 2.9.2011, 8:47

Цитата(silver47 @ 2.9.2011, 5:28) *
Не понял вопроса. Я всегда пишу гуи сам, без дизайнера.

А я - нет. В этом и трабл.

Вроде разобрался. Правда не через сигналы и слоты, а через публичные функции.

Пример:

 two_windows_ui.zip ( 3.29 килобайт ) : 99
 

Автор: silver47 2.9.2011, 9:52

Это хорошее решение. У меня сейчас проект, в котором нужно некритичную ошибку при работе, записать в лог и продолжить работу. Записью в лог занимается главное окно. А у дочерних окон, есть поддочерние и так далее.. глубина вложенности по классам по 4-5. Там с помощью публичных функций не так просто это сделать, нужно будет постоянно таскать за собой указатель на главное окно. Вот тут и выручают сигналы-слоты.

class MainClass(...){
private:
public:
private slots:
  void catchError(QString);
}

class SubClass(...){
private:
public:
signals:
  void throwError(QString);
}

class SubSubClass(...){
private:
public:
signals:
  void throwError(QString);
}

// тогда работа будет выглядеть так:
// subClass.cpp
SubSubClass sc(this);
QObject::connect(&sc, SIGNAL(throwError(QString)), this, SIGNAL(throwError(QString))); // соединяем не сигнал со слотом, а сигнал с сигналом.
// в результате можно отловить любое событие главным окном от дочернего любого уровня вложенности без таскания указателя главного окна и без создания промежуточных слотов


Наверняка есть более эстетичные способы это сделать, я не профессионал. Но про то, что можно сигнал с сигналом соединять, где-то читал :)

Автор: RazrFalcon 2.9.2011, 10:43

У меня, пока, вложенности нет, но решение интересное. Про сигнал-сигнал не слышал.

Автор: Алексей1153 2.9.2011, 19:22

Цитата
Но про то, что можно сигнал с сигналом соединять, где-то читал


так в справке это написано :) Там и читал. Процитировать не могу, нет под рукой

Автор: Максим 3.9.2011, 17:07

class Preference : public QDialog, private Ui::Preference// private заменить на protected
...

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)