Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление главным окном из дочернего
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
RazrFalcon
.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
первый вопрос: как и где определено table
второй вопрос: зачем после #include "mainwindow.h" идет форвард class MainWindow;
RazrFalcon
1) mainwindow.ui + ui_mainwindiw.h
2) ХЗ <_<
silver47
Эм... мне в таких случаях помогает система сигналов-слотов. Главное окно создает дочернее и тут же прикручивает сигнал от дочернего к своему слоту. А по поводу
mainWindow->table->hide(); // нужно чтобы table был объявлен в секции public, что не есть хорошо.
RazrFalcon
А почему тогда если я сам пишу гуи, без дизайнера и ui, то я могу управлять главным окном из дочернего?
silver47
Цитата(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
Цитата(silver47 @ 2.9.2011, 5:28) *
Не понял вопроса. Я всегда пишу гуи сам, без дизайнера.

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

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

Пример:
silver47
Это хорошее решение. У меня сейчас проект, в котором нужно некритичную ошибку при работе, записать в лог и продолжить работу. Записью в лог занимается главное окно. А у дочерних окон, есть поддочерние и так далее.. глубина вложенности по классам по 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
У меня, пока, вложенности нет, но решение интересное. Про сигнал-сигнал не слышал.
Алексей1153
Цитата
Но про то, что можно сигнал с сигналом соединять, где-то читал


так в справке это написано :) Там и читал. Процитировать не могу, нет под рукой
Максим
class Preference : public QDialog, private Ui::Preference// private заменить на protected
...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.