Russian Qt Forum
Июнь 16, 2024, 01:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: множественное наследование  (Прочитано 8558 раз)
алексей
Гость
« : Февраль 01, 2009, 11:55 »

Здравствуйте !!! Есть класс:

Код:
class my_dialog : public QDialog //,public for_test
{
Q_OBJECT
public :
my_dialog(QWidget *parent = 0);
private:
QLineEdit *lineEdit;
private slots:
void on_lineEdit_textChanged(const QString &);
};

реализация:
Код:
my_dialog::my_dialog(QWidget *parent): QDialog(parent)
{
my_dialog::lineEdit = new QLineEdit;
QObject::connect(my_dialog::lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(my_dialog::on_lineEdit_textChanged(const QString &)));
QHBoxLayout *mainLayout = new QHBoxLayout();
mainLayout->addWidget(my_dialog::lineEdit);
QWidget::setLayout(mainLayout);
QWidget::setWindowTitle(tr("Filtr"));   
}

задача в том, чтобы при вызове слота on_lineEdit_textChanged можно было получить доступ к виджетам основной формы. Класс основной формы - class for_test : public QMainWindow
Если пытаюсь наследоваться дополнительно от класса for_test
Код:
class my_dialog : public QDialog ,public for_test
компилятор ругается - ambiguous conversions from 'my_dialog *const ' to 'const QObject *' на строчку
Код:
QObject::connect(my_dialog::lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(my_dialog::on_lineEdit_textChanged(const QString &))); 
Пробовал подругому:в секцию private в my_dialog добавил - Ui::for_testClass *ui_; в реализации соответственно добавил:
Код:
ui_=new Ui::for_testClass;
ui_->lineEdit->setText("");
программа запускается, но на строчке  - ui_->lineEdit->setText(""); вылетает.
Подскажите, что я делаю не так Непонимающий Среда разработки - Visual Studio 2008.

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Февраль 01, 2009, 12:11 »

Множественное наследование от двух классов, порожденных от QObject, запрещено.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #2 : Февраль 01, 2009, 12:19 »

написал программу, а она не собирается - где у меня ошибка? © :[|||]:

даже не буду смеяться над твоим кодом - просто скажу: "учи плюсы, учи кутэ."
а решение твоей задачи элементарное - в две строчки: сделай my_dialog другом for_test; передай в экземпляр my_dialog указатель на экземпляр for_test. из on_lineEdit_textChanged обращайся к детям my_dialog через переданный ранее указатель.
Записан
алексей
Гость
« Ответ #3 : Февраль 01, 2009, 17:19 »

написал программу, а она не собирается - где у меня ошибка? © :[|||]:

даже не буду смеяться над твоим кодом - просто скажу: "учи плюсы, учи кутэ."
а решение твоей задачи элементарное - в две строчки: сделай my_dialog другом for_test; передай в экземпляр my_dialog указатель на экземпляр for_test. из on_lineEdit_textChanged обращайся к детям my_dialog через переданный ранее указатель.

Ну то что это программа - я и не говорил....так....пытаюсь перелесть после 9 лет программирования на delphi  - там действительно были проекты....а - это всего лишь первые шаги,  и что означает термин в программировании "сделай my_dialog другом for_test" Непонимающий Заранее спасибо.....
« Последнее редактирование: Февраль 01, 2009, 17:25 от алексей » Записан
ритт
Гость
« Ответ #4 : Февраль 01, 2009, 17:27 »

Код
C++ (Qt)
class for_test ...
{
...
private:
friend class my_dialog;
 
int abc;
...
};
 
//...
 
class my_dialog ...
{
...
private slots:
void some_slot();
 
private;
for_test* mw;
...
};
 
 
void my_dialog::some_slot()
{
mw->abc = 123;
}
 
Записан
алексей
Гость
« Ответ #5 : Февраль 01, 2009, 20:13 »

Спасибо, огромное, Константин за Вашу подсказку, компилер не ругается, но вот когда пытаюсь изменить содержание label в основной форме, данными вводимыми в созданном edit-е ничего не происходит. Делал так:

Код:
class for_test : public QMainWindow
{
Q_OBJECT
public:
        for_test(QWidget *parent = 0, Qt::WFlags flags = 0);
        ~for_test();
private:
       Ui::for_testClass ui;
       friend class my_dialog;
       int test_item;
private slots:
       void on_pushButton_3_clicked();
};
class QLineEdit;
class my_dialog : public QDialog
{
Q_OBJECT
public :
my_dialog(QWidget *parent = 0);
private:
for_test  *my_test;
QLineEdit *lineEdit;
private slots:
void on_lineEdit_textChanged(const QString &);
};

реализация
Код:
my_dialog::my_dialog(QWidget *parent): QDialog(parent)
{
lineEdit = new QLineEdit;  
connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(on_lineEdit_textChanged(const QString &)));
QHBoxLayout *mainLayout = new QHBoxLayout();
mainLayout->addWidget(my_dialog::lineEdit);
setLayout(mainLayout);
setWindowTitle(tr("Filter"));
my_test=new for_test();
 }

void my_dialog::on_lineEdit_textChanged(const QString &)
{
my_test->ui.label->setText(lineEdit->text()); //не работает !!!!!!
}

Может дело в неверной инициализации - my_test=new for_test(); Непонимающий
Заранее спасибо....
« Последнее редактирование: Февраль 01, 2009, 20:16 от алексей » Записан
ритт
Гость
« Ответ #6 : Февраль 01, 2009, 21:23 »

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

Код
C++ (Qt)
//somewhere
for_test* mw = new for_test();
//...
my_dialog* dlg = new my_dialog();
dlg->my_test = mw;
//...
 

строку my_test=new for_test(); из конструктора my_dialog убрать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.208 секунд. Запросов: 22.