Russian Qt Forum

Qt => Общие вопросы => Тема начата: алексей от Февраль 01, 2009, 11:55



Название: множественное наследование
Отправлено: алексей от Февраль 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.



Название: Re: множественное наследование
Отправлено: pastor от Февраль 01, 2009, 12:11
Множественное наследование от двух классов, порожденных от QObject, запрещено.


Название: Re: множественное наследование
Отправлено: ритт от Февраль 01, 2009, 12:19
написал программу, а она не собирается - где у меня ошибка? © :[|||]:

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


Название: Re: множественное наследование
Отправлено: алексей от Февраль 01, 2009, 17:19
написал программу, а она не собирается - где у меня ошибка? © :[|||]:

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

Ну то что это программа - я и не говорил....так....пытаюсь перелесть после 9 лет программирования на delphi  - там действительно были проекты....а - это всего лишь первые шаги,  и что означает термин в программировании "сделай my_dialog другом for_test" ??? Заранее спасибо.....


Название: Re: множественное наследование
Отправлено: ритт от Февраль 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;
}
 


Название: Re: множественное наследование
Отправлено: алексей от Февраль 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(); ???
Заранее спасибо....


Название: Re: множественное наследование
Отправлено: ритт от Февраль 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 убрать.