Qt4 получить доступ к виджитам диалогового окна (Из главного окна достать переменные диалогового)

Модератор: Модераторы разделов

Аватара пользователя
GodHermes
Сообщения: 68
ОС: openSuSE 11.2 x86_64

Qt4 получить доступ к виджитам диалогового окна

Сообщение GodHermes »

В общем как из основного окна получить доступ к виджетам диалогового окна, которое создано с помощью QtDesigner
вот так создаю диалоговое окно из главного (диалоговое окно - модальное):

Код: Выделить всё

        dialog = new optionDialog(this);
        connect(dialog, SIGNAL(accepted()), this, SLOT(slotSaveDialog()));
        if(dialog->exec())
        {
        }


как в слоте главного окна считать текст например из lineEdit ?
Знать всё невозможно, можно только вовремя находить то что необходимо
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение alfss »

Dialog(QLineEdit *Line1, QWidget *parent)
Спасибо сказали:
Аватара пользователя
GodHermes
Сообщения: 68
ОС: openSuSE 11.2 x86_64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение GodHermes »

нет, не задание значения виджитам диалогового окна, а прочитать их значения после выполнения (т.е. когда пользователь нажмет Ок, нужно узнать что он там на кликал, написал, наизменял и т.д.)
Знать всё невозможно, можно только вовремя находить то что необходимо
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение alfss »

можно через указатели QLineEdit *Line1

можно методом: QString GetQline1(void);
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение Crazy »

qmake создает из *.ui класс, с открытыми членами данных.
Ну можно поставить слот на сигнал clicked().

Desipere in loco
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение RasenHerz »

Чтобы получить доступ к закрытым данным класса можно делать так:

Код: Выделить всё

class A;

class B{
public:
    void boom();
};

class A {
public:
    A();
    A(const A& orig);
    virtual ~A();

    friend class B;

private:

    void printString(const char*);

};


Код: Выделить всё

#include <iostream>

using namespace std;

void A::printString(const char *str)
{
    if (!str)
        return;

    cout << str;
}

void B::boom()
{
    A *a = new A();

    a->printString("boom!\n");//получили доступ к закрытой функции

    delete a;
}


Теперь вы сможете получать доступ к закрытым членам класса. Но лучше всего реализовать класс-потомок от QDialog и определить в нем функции доступа к необходимым данным.
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение alfss »

Теперь вы сможете получать доступ к закрытым членам класса. Но лучше всего реализовать класс-потомок от QDialog и определить в нем функции доступа к необходимым данным.


Вообще QtDesigner создает поля как public. так что можно прост на прямую обращаться.

Код: Выделить всё

class Ui_DialogAddAliases
{
public:
    QVBoxLayout *verticalLayout;
    QHBoxLayout *horizontalLayout_2;
    QLabel *label;
    QLineEdit *lineEdit_Local_Part;
    QLabel *label_2;

.......................................
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение deadhead »

/offtop
alfss писал(а):
18.08.2009 12:14
Вообще QtDesigner создает поля как public. так что можно прост на прямую обращаться.

а как же инкапсуляция ;-)
[x] close
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение RasenHerz »

alfss писал(а):
18.08.2009 12:14
Вообще QtDesigner создает поля как public. так что можно прост на прямую обращаться.

Все это конечно хорошо, но лучше создать функции-обертки, т.к. во-первых, это не нарушит инкапсуляцию, а во-вторых, в случае изменения/удаления виджетов не придется переписывать весь код который обращался к этим виджетам, а нужно будет только поправить функции-обертки.
Спасибо сказали:
alfss
Сообщения: 262

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение alfss »

RasenHerz писал(а):
18.08.2009 14:51
alfss писал(а):
18.08.2009 12:14
Вообще QtDesigner создает поля как public. так что можно прост на прямую обращаться.

Все это конечно хорошо, но лучше создать функции-обертки, т.к. во-первых, это не нарушит инкапсуляцию, а во-вторых, в случае изменения/удаления виджетов не придется переписывать весь код который обращался к этим виджетам, а нужно будет только поправить функции-обертки.


В этом я согласен. Только нас спрашивали - как можно, а не как правильно)).
Спасибо сказали:
Аватара пользователя
GodHermes
Сообщения: 68
ОС: openSuSE 11.2 x86_64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение GodHermes »

RasenHerz писал(а):
18.08.2009 12:08
Теперь вы сможете получать доступ к закрытым членам класса. Но лучше всего реализовать класс-потомок от QDialog и определить в нем функции доступа к необходимым данным.

т.е. в диалоговом окне, нужно определить функции которые будут возвращать значения для необходимых мне виджитов.
например:

Код: Выделить всё

class dialog{
public:
    bool returnValueSamWidget(); //вренуть значения определённого виджета
};

а из главного окна делать соответственно:

Код: Выделить всё

optionDialog *dialog;
dialog= new optionDialog();
bool flag = dialog->returnValueSamWidget();


я правильно вас понял ?
Знать всё невозможно, можно только вовремя находить то что необходимо
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение RasenHerz »

Ну если ваша форма имеет тип MyForm и является потомком от QDialog, то лучше так:

Код: Выделить всё

class Dialog: public QDialog, private MyForm{
Q_OBJECT

public:
    bool returnValueSamWidget(); //вернуть значения определённого виджета
};

и желательно не забыть помимо конструкторов по-умолчанию создать конструктор вида Dialog(QWidget *parent), чтобы для QDialog указать родительский виджет:

Код: Выделить всё

Dialog::Dialog(QWidget *parent = 0): QDialog(parent){
    setupUi(this);//и т.д.
};
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение Crazy »

RasenHerz писал(а):
18.08.2009 14:51
alfss писал(а):
18.08.2009 12:14
Вообще QtDesigner создает поля как public. так что можно прост на прямую обращаться.

Все это конечно хорошо, но лучше создать функции-обертки, т.к. во-первых, это не нарушит инкапсуляцию, а во-вторых, в случае изменения/удаления виджетов не придется переписывать весь код который обращался к этим виджетам, а нужно будет только поправить функции-обертки.

Qt Creator помещает экземпляр этого класса, в класс разрабатываемого класса виджета. Так что все грамотно делается.

Desipere in loco
Спасибо сказали:
Аватара пользователя
GodHermes
Сообщения: 68
ОС: openSuSE 11.2 x86_64

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение GodHermes »

Crazy писал(а):
19.08.2009 15:10
Так что все грамотно делается.

А это как ? если можно то с примером ;-)

RasenHerz
ну это понятно, я собственно так и делаю...
Знать всё невозможно, можно только вовремя находить то что необходимо
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Qt4 получить доступ к виджитам диалогового окна

Сообщение Crazy »

GodHermes писал(а):
20.08.2009 10:44
Crazy писал(а):
19.08.2009 15:10
Так что все грамотно делается.

А это как ? если можно то с примером ;-)


Можно использовать наследование:

Код: Выделить всё

#include "ui_MyForm.h"

class MyForm::public QWidget
{
  Q_OBJECT
private:
  Ui::MyForm m_ui;
public:
  MyForm(QWidget* pwgt = 0) :  QWidget(pwgt)
  {
     m_ui.setupUi(this);
    //...
  }
 // ...
};

Qt Creator делает так:
widget.h

Код: Выделить всё

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

namespace Ui
{
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

Код: Выделить всё

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


Можно еще использовать множественное наследование

Код: Выделить всё

#include "ui_MyForm.h"

class MyForm::public QWidget, public Ui::MyForm
{
  Q_OBJECT
public:
  MyForm(QWidget* pwgt = 0) :  QWidget(pwgt)
  {
    setupUi(this);
    //...
  }
 // ...
};

Desipere in loco
Спасибо сказали: