.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;
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
первый вопрос: как и где определено table
второй вопрос: зачем после #include "mainwindow.h" идет форвард class MainWindow;
1) mainwindow.ui + ui_mainwindiw.h
2) ХЗ
Эм... мне в таких случаях помогает система сигналов-слотов. Главное окно создает дочернее и тут же прикручивает сигнал от дочернего к своему слоту. А по поводу
mainWindow->table->hide(); // нужно чтобы table был объявлен в секции public, что не есть хорошо.
А почему тогда если я сам пишу гуи, без дизайнера и 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
Это хорошее решение. У меня сейчас проект, в котором нужно некритичную ошибку при работе, записать в лог и продолжить работу. Записью в лог занимается главное окно. А у дочерних окон, есть поддочерние и так далее.. глубина вложенности по классам по 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))); // соединяем не сигнал со слотом, а сигнал с сигналом.
// в результате можно отловить любое событие главным окном от дочернего любого уровня вложенности без таскания указателя главного окна и без создания промежуточных слотов
У меня, пока, вложенности нет, но решение интересное. Про сигнал-сигнал не слышал.
class Preference : public QDialog, private Ui::Preference// private заменить на protected
...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)