crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Управление главным окном из дочернего
RazrFalcon
  опции профиля:
сообщение 24.8.2011, 16:53
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


.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
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


первый вопрос: как и где определено table
второй вопрос: зачем после #include "mainwindow.h" идет форвард class MainWindow;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.8.2011, 22:06
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


1) mainwindow.ui + ui_mainwindiw.h
2) ХЗ <_<
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 25.8.2011, 5:35
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Эм... мне в таких случаях помогает система сигналов-слотов. Главное окно создает дочернее и тут же прикручивает сигнал от дочернего к своему слоту. А по поводу
mainWindow->table->hide(); // нужно чтобы table был объявлен в секции public, что не есть хорошо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 1.9.2011, 21:31
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


А почему тогда если я сам пишу гуи, без дизайнера и ui, то я могу управлять главным окном из дочернего?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 2.9.2011, 5:28
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Цитата(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
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


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

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

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

Пример:
Прикрепленные файлы
Прикрепленный файл  two_windows_ui.zip ( 3.29 килобайт ) Кол-во скачиваний: 40
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 2.9.2011, 9:52
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


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


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

Сообщение отредактировал silver47 - 2.9.2011, 9:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 2.9.2011, 10:43
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


У меня, пока, вложенности нет, но решение интересное. Про сигнал-сигнал не слышал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.9.2011, 19:22
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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


так в справке это написано :) Там и читал. Процитировать не могу, нет под рукой
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.5.2019, 5:29