Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Передача данных от одной формы другой

Автор: neneTc 9.3.2010, 17:02

Здравствуйте! Столкнулся с проблемой при передаче данных от одной форме другой. Предлагали использовать сигналы-слоты, но формы не имеют указателя друг на друга чтобы через сигналы-слоты взаимодействовать. Как мне всё-таки сконнектить и осуществить передачу данных между двумя формами?

Автор: kwisp 9.3.2010, 17:05

neneTc,

Цитата(neneTc @ 9.3.2010, 17:02) *
формы не имеют указателя друг на друга

это не обязательно, соединять и разъединять можно в любом месте программы. хоть в main.cpp главное чтоб там указатели были.

Автор: neneTc 9.3.2010, 17:08

В main.cpp нет указателя на второе окно

Автор: kwisp 9.3.2010, 17:09

Цитата(neneTc @ 9.3.2010, 17:08) *
В main.cpp нет указателя на второе окно

ну я для примера сказал :)
где то же есть место где есть оба указателя на кона?

если нет создай его.(место)

Автор: neneTc 9.3.2010, 17:42

а как осуществить передачу через коннект?

Автор: kwisp 9.3.2010, 17:45

http://wiki.crossplatform.ru/index.php/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B_%D0%B8_%D1%81%D0%BB%D0%BE%D1%82%D1%8B_%28Qt%29

Автор: neneTc 9.3.2010, 18:16

Спасибо) После 3 дней втыкания в различные маны всё заработало! Наконец-то)

Автор: Vexar 19.3.2010, 3:55

Цитата(neneTc @ 10.3.2010, 1:16) *
Спасибо) После 3 дней втыкания в различные маны всё заработало! Наконец-то)


А можно подробнее что да как?

Автор: Litkevich Yuriy 21.3.2010, 20:16

Цитата(Vexar @ 19.3.2010, 6:55) *
А можно подробнее что да как?
что именно не понятно?

Автор: Vexar 22.3.2010, 1:38

Есть у меня Главное окно и Диалоговое. Мне нужно передать данные из Диалогового окна в Главное.

Делаю так:

Dialog:

    LoginSysName = new QLabel(tr("Name:"));
    LineEditName = new QLineEdit;
    LoginSysName->setBuddy(LineEditName);
    QObject::connect(LineEditName, SIGNAL(textChanged(QString)), LineEdit, SLOT(setText(QString)));


MainWindow:

    LineEdit = new QLineEdit;
    QObject::connect(LineEdit, SIGNAL(textChanged(QString)), LineEditName, SLOT(setText(QString)));

Автор: Litkevich Yuriy 22.3.2010, 1:39

Вопрос:
1) Диалоговое окно модальное?

Автор: Vexar 22.3.2010, 1:57

Диалоговое окно, но лучше наверно сделать модальное.

mainwindow.cpp

void MainWindow::LoginSys()
{
    if (!EnterDialog)
    {
         EnterDialog = new LoginSysDialog(this);
    }

    EnterDialog->show();
    EnterDialog->activateWindow();
}

Автор: Litkevich Yuriy 22.3.2010, 10:38

обычно данные из диалоговых окон передаются в главное, по закрытию диалогового окна.
Для этого в диалоговом окне предусматривают методы чтения данных.
Например, для чтения текста из LoginSysDialog::LineEditName, можно написать метод LoginSysDialog::name, тогда в главном окне после закрытия диалога просто вызываешь этот метод.
Вот у меня диалог ввода имени пользователя и пароля:

class DialogLogin : public QDialog, public Ui::DialogLogin
{
    Q_OBJECT
public:
    DialogLogin(QWidget* parent= 0);
    
    QString    login() const;
    QString    password() const;
};
Вот так используется в главном окне:
DialogLogin    loginDialog(this);

if (loginDialog.exec() == QDialog::Accepted)
{
    login=loginDialog.login();
    pswd=loginDialog.password();
}

Автор: PunX 8.4.2010, 19:04

Здравствуйте, я своём приложении мне необходимо сделать следующее: при запуске появляется окно где пользоветль вводит логин и пароль, после успешной авторизации появляется основное(главное) окно программы.
Я делаю следующее:
1. в Qt Creator создаю GUI приложение
2. добавляю в него новую форму и добавляю соответствующие этой форме файлы .h и .cpp
3. в файл .h добавляю следующее:

#ifndef DIALOG_LOGIN_H
#define DIALOG_LOGIN_H
#include <QDialog>

namespace Li {
    class MyForm;
}

class MyWidget: public QDialog
{
    Q_OBJECT
public:
    MyWidget(QDialog *parent = 0);
    ~MyWidget();

private:
    Li::MyWidget *li;
};
#endif // DIALOG_LOGIN_H

4. в файл .cpp добавляю
#include "dialog_login.h"
#include "ui_dialog_login.h"

MyWidget::MyWidget(QDialog *parent)
    :QDialog(parent), li(new Li::MyForm())
{
    li->setupUi(this);
}

MyWidget::~MyWidget()
{
    delete li;
}

Но даже на этом шаге компиляция рушиться с ошибками. Подскажите пожалуйста, на каком шаге делаю что-то не так?

Автор: BRE 8.4.2010, 19:14

А почему неймспейс называется Li::? По-умолчанию uic вроде генерирует Ui::

namespace Li {
    class MyForm;
}

Автор: PunX 8.4.2010, 19:20

Да, это исправил заменил на Ui, но это не помогло.

Автор: BRE 8.4.2010, 19:28

Цитата(PunX @ 8.4.2010, 20:20) *
Да, это исправил заменил на Ui, но это не помогло.

private:
    Ui::MyForm *li;
}

Автор: PunX 8.4.2010, 19:30

отредактировал до такого состояния, ошибок стало вроде меньше, но всё ранво не пойму что не так
.h

#ifndef DIALOG_LOGIN_H
#define DIALOG_LOGIN_H
#include <QDialog>
namespace Ui {
    class login;
}
class login : public QDialog{
    Q_OBJECT
public:
    login(QDialog *parent = 0);
    ~login();

private:
    Ui::login *ui;
};
#endif // DIALOG_LOGIN_H

.cpp
#include "dialog_login.h"
#include "ui_dialog_login.h"

login::login(QDialog *parent) : QDialog(parent),ui(new Ui::login)
{
    ui->setupUI(this);
}

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

Автор: BRE 8.4.2010, 19:34

#include "dialog_login.h"
login::login(QDialog *parent) : QDialog(parent),ui(new Ui::login)
{
    ui->setupUi(this);
}


А лучше покажи сразу все ошибки. :)

Автор: PunX 8.4.2010, 19:38

project_alfa/dialog_login.cpp:4: error: invalid use of incomplete type 'struct Ui::login'
project_alfa/dialog_login.h:5: error: forward declaration of 'struct Ui::login'
project_alfa/dialog_login.cpp:6: error: invalid use of incomplete type 'struct Ui::login'
project_alfa/dialog_login.h:5: error: forward declaration of 'struct Ui::login'
project_alfa/dialog_login.cpp:10: warning: possible problem detected in invocation of delete operator:
project_alfa/dialog_login.cpp:10: warning: invalid use of incomplete type 'struct Ui::login'
project_alfa/dialog_login.h:5: warning: forward declaration of 'struct Ui::login'
project_alfa/dialog_login.cpp:10: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.

вот все которые вылетают, может я свою задачу не так реализовываю? может можно проще всё сделать?

Автор: BRE 8.4.2010, 19:43

А точно в файле ui_dialog_login.h класс называется login?
С учетом регистра и т.д.?

Автор: PunX 8.4.2010, 19:50

Спасибо нашёл ошибку) надо было имя класса поменять на Dialog.

Автор: Litkevich Yuriy 8.4.2010, 19:53

Цитата(PunX @ 8.4.2010, 23:04) *
:QDialog(parent), li(new Li::MyForm())
в конструктор MyForm наверняка надо передать this и не удалять его руками в последствии

Автор: PunX 8.4.2010, 20:03

Сейчас формы вызываются, всё вроде работает. Перечитал все соообщения в теме сначала, но не понял как теперь связать эти две формы? как сделать чтобы при удачном завершении формы входа, открывалось основное окно? (Подозреваю что всё это делается с помощью slot-ов?)

Автор: PunX 8.4.2010, 22:09

Поставлю вопрос по другому, можно ли сделать так чтобы сначала запускалось окно входа (логин), при получении данных с него, открывалось главное окно, а окно логина закрывалось?

Автор: Litkevich Yuriy 8.4.2010, 22:10

Цитата(PunX @ 9.4.2010, 0:03) *
Подозреваю что всё это делается с помощью slot-ов?
нет. Я приводил пример в http://www.forum.crossplatform.ru/index.php?showtopic=4492&view=findpost&p=31936

Цитата(PunX @ 9.4.2010, 2:09) *
так чтобы сначала запускалось окно входа (логин), при получении данных с него, открывалось главное окно, а окно логина закрывалось?
тогда вызывай диалог до создания главного окна

Автор: PunX 8.4.2010, 22:17

Извините может за глупые вопросы, могли бы вы привести пример как вызвать диалог для создания главного окна?

Автор: Litkevich Yuriy 9.4.2010, 7:06

Цитата(PunX @ 9.4.2010, 2:17) *
как вызвать диалог для создания главного окна?
в функции main.
int main(int argc, char *argv[])
{

    QApplication app(argc, argv);
    
    QString login, password;
    const QString LOGIN = "mylogin", PASSWORD = "mypassword";
    {
        MyDialog dialog(this);
        if (dialog.exec() == QDialog::Rejected)
            return 1;
        if (dialog.login() != LOGIN) || (dialog.password() != PASSWORD)
            return 1;
    }
    MainWindow w;

    w.resize(750, 550);
    w.show();

    return app.exec();
}

Автор: PunX 11.4.2010, 18:52

Всё прекрасно работает и окно входа и потом запускается главное окно, НО появилась такая потребность получить в главное окно логин пользователя который был введён в окне входа. Способ из http://www.forum.crossplatform.ru/index.php?s=&showtopic=4492&view=findpost&p=31936 этой темы не подходит, т.к. диалоговое окно входа (где вводится логин и пароль) вызывается в main.cpp и получить данные в других модулях не получается.

Автор: BRE 11.4.2010, 18:56

Можно передать их в конструкторе MainWindow:

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);
    
    QString login, password;
    const QString LOGIN = "mylogin", PASSWORD = "mypassword";
    {
        MyDialog dialog(this);
        if (dialog.exec() == QDialog::Rejected)
            return 1;
        if (dialog.login() != LOGIN) || (dialog.password() != PASSWORD)
            return 1;
    }
    MainWindow w( login, password );

    w.resize(750, 550);
    w.show();

    return app.exec();
}

Автор: PunX 11.4.2010, 20:32

Вообщем у меня получилось такое
login.h

Раскрывающийся текст
#ifndef LOGIN_H
#define LOGIN_H
#include <QtSql>
#include "dialog_login.h"
#include <QMessageBox>
QString error;

bool createConnections(QString db_dbname,QString db_host,QString db_username,QString db_pass)
{

    QSqlDatabase psql = QSqlDatabase::addDatabase( "QPSQL" );
    if ( !psql.driver() ) {
        error = "Failed to connect to psql driver";
        return FALSE;
    }

    psql.setDatabaseName( db_dbname );
    psql.setUserName( db_username );
    psql.setPassword( db_pass );
    psql.setHostName( db_host );

    if ( !psql.open() ) {
        error = "Failed to open orders database: " +
                psql.lastError().driverText();
        error = psql.lastError().databaseText();
        psql.close();
        return FALSE;
    }
    return TRUE;
}
bool enter (){
    Dialog dialog;
    if(dialog.exec() == QDialog::Rejected)
        return 1;
    if(!createConnections("postgres","localhost",dialog.login(),dialog.password()))
    {
        int i = QMessageBox::warning(0,"Warning","incorrect password or username\n"+error,QMessageBox::Ok);
        if(i == QMessageBox::Ok){
            enter();
        }
        return 1;
    }else{
        return 0;
    }

}
#endif // LOGIN_H

и main.cpp
Раскрывающийся текст
#include <QtGui/QApplication>
#include <QMessageBox>
#include "mainwindow.h"
#include "dialog_login.h"
#include "login.h"
int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));    ///< Для строковых констант
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));        ///< Для функций перевода tr()
    QApplication a(argc, argv);
    if(enter()){
        return 0;
    }

    MainWindow w;
    w.show();
    return a.exec();
}

как сделать так чтобы db_username,db_dbname были доступны и эти переменные можно было использовать?

Автор: BRE 11.4.2010, 20:35

Цитата(PunX @ 11.4.2010, 21:32) *
как сделать так чтобы db_username,db_dbname были доступны и эти переменные можно было использовать?

Доступны где?

Автор: PunX 11.4.2010, 20:37

Доступны для того чтобы вывести их на форму, т.е. доступны в mainwindow.cpp.

Автор: BRE 11.4.2010, 20:49

Можно, например так:

main.cpp

Раскрывающийся текст
#include <QtGui/QApplication>
#include <QMessageBox>
#include "mainwindow.h"
#include "dialog_login.h"

bool createConnections(QString db_dbname,QString db_host,QString db_username,QString db_pass)
{

    QSqlDatabase psql = QSqlDatabase::addDatabase( "QPSQL" );
    if ( !psql.driver() ) {
        error = "Failed to connect to psql driver";
        return FALSE;
    }

    psql.setDatabaseName( db_dbname );
    psql.setUserName( db_username );
    psql.setPassword( db_pass );
    psql.setHostName( db_host );

    if ( !psql.open() ) {
        error = "Failed to open orders database: " +
                psql.lastError().driverText();
        error = psql.lastError().databaseText();
        psql.close();
        return FALSE;
    }
    return TRUE;
}

int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));    ///< Для строковых констант
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));        ///< Для функций перевода tr()
    QApplication a(argc, argv);

    QString db_name = "postgres";
    QString db_login;

    forever
    {
        Dialog dialog;
        if(dialog.exec() == QDialog::Rejected)
            return 1;

        if( createConnections( db_name, "localhost", dialog.login(), dialog.password() ) )
        {
            db_login = dialog.login();
            break;
        }
        
        QMessageBox::warning(0,"Warning","incorrect password or username\n"+error,QMessageBox::Ok);
    }

    MainWindow w( db_name, db_login );
    w.show();
    return a.exec();
}


Автор: PunX 11.4.2010, 20:55

Если делать таким вариантом то выдаёт error: no matching function for call to 'MainWindow::MainWindow(QString&, QString&)'

Автор: Litkevich Yuriy 11.4.2010, 20:58

лучше сделать отдельный диалог для настройки соединения с БД, при старте программы в конструкторе главного окна читать настройки из INI-файла, вызывать некий метод главного окна, который настроит соединение. А когда понадобится изменить настройки, вызывать диалог (он должен будет прочитать настройки из INI-файла), чтобы пользователь в вёл новые данные, если ввод успешен, то сохранять настройки в INI-файл и опять вызывать метод настраивающий соединение.

Цитата(PunX @ 12.4.2010, 0:55) *
MainWindow::MainWindow(QString&, QString&)'
дак ты напиши конструктор, который принимает логин и пароль.

Автор: BRE 11.4.2010, 20:59

Цитата(PunX @ 11.4.2010, 21:55) *
Если делать таким вариантом то выдаёт error: no matching function for call to 'MainWindow::MainWindow(QString&, QString&)'

Ну так напиши такой конструктор для MainWindow, который будет принимать эти параметры и сохранять/использовать их.

Для освоения Qt, необходимо знать C++. ;)

Автор: PunX 11.4.2010, 21:00

Попробую сделать с файлом конфигурации. Спасибо.

Автор: PunX 11.4.2010, 22:33

Работа через файл это конечно хорошо, но решил разобраться с другим вариантом, сдвиги есть, но результата положительного пока нет.
1.Создал конструктор

MainWindow::MainWindow(QString db_l, QString db_n)
{
db_login = db_l;
db_name = db_n;
}
db_name и db_login; объявленны public в классе MainWindow.
2.Создаю объекты
MainWindow db(db_name, db_login);
MainWindow w;
w.show();

3. Чтобы достать переменные, делаю следующее
QString l = MainWindow::db_login;
ui->label_3->setText(l);
Компиляция проходит без ошибок, но в label_3 ничего нет. Пока не могу понять в чём ошибка.
P.S. Извините за глупые вопросы, стараюсь во всём разобраться.

Автор: Litkevich Yuriy 12.4.2010, 8:32

Цитата(PunX @ 12.4.2010, 2:33) *
QString l = MainWindow::db_login;
а вот это что за запись? как ты её понимаешь?

Автор: PunX 12.4.2010, 8:49

Да, написал туфту наверное, но как правильно достать теперь переменную?

Автор: Litkevich Yuriy 12.4.2010, 8:54

Цитата(PunX @ 12.4.2010, 12:49) *
Да, написал туфту наверное, но как правильно достать теперь переменную?
ты объясни, чего ты ожидал от записи: MainWindow::db_login;

Автор: PunX 12.4.2010, 9:05

Ожидал что вернется значение переменной логин

Автор: Litkevich Yuriy 12.4.2010, 9:23

к членам объекта (экземпляра) класса обращаются так.
Извне класса
Если объект объявлен как скаляр:

MyClass object;
object.variableMember
object.functionMember()

если объект - указатель
MyClass *object;
object->variableMember
object->functionMember()


Внутри класса к своим членам обращаются не посредственно:
variableMember
functionMember()


Цитата(Litkevich Yuriy @ 12.4.2010, 12:54) *
MainWindow::db_login;
таким способом обращаются извне класса к статическим членам класса (т.е. к которым можно обращаться не создавая объект вообще).
Либо таким способом обращаться внутри класса к членам базового класса, от которого унаследован текущий класс

Автор: PunX 12.4.2010, 9:38

Спасибо за подробное разъяснение, но не понятно как сделать в моём случае? Я объект создаю в мэйн.цпп и передаю ему параметры, а использоваться полученные переменные должны в мэйнвиндоу.цпп.

Автор: Litkevich Yuriy 12.4.2010, 9:40

вот этот код:

QString l = MainWindow::db_login;
ui->label_3->setText(l);
в какой функции находится?

Автор: PunX 12.4.2010, 10:43

в функции void MainWindow::chengeEvent(QEvent *e) файла mainwindow.cpp

Автор: Litkevich Yuriy 12.4.2010, 13:26

Цитата(PunX @ 12.4.2010, 14:43) *
в функции void MainWindow::chengeEvent(QEvent *e)
т.е. внутри класса MainWindow, вот и смотри сообщение №44, там указано как обрщаться внутри класса к его собственным членам

Автор: PunX 12.4.2010, 15:58

Хм, прочитав ещё 44 сообщение, делаю следующее ui->label_3->setText(db_login); т.к. вызываю переменную внутри класса, создаю объекты в main.cpp

MainWindow db(db_name, db_login);
MainWindow w;
w.show();

но желаемого результата в label не нахожу.

Автор: BRE 12.4.2010, 16:00

Цитата(PunX @ 12.4.2010, 16:58) *
Хм, прочитав ещё 44 сообщение, делаю следующее ui->label_3->setText(db_login); т.к. вызываю переменную внутри класса, создаю объекты в main.cpp
MainWindow db(db_name, db_login);
MainWindow w;
w.show();

но желаемого результата в label не нахожу.

Для чего создавать два объекта MainWindow?
MainWindow w(db_name, db_login);
w.show();


Автор: Litkevich Yuriy 12.4.2010, 16:03

Цитата(BRE @ 12.4.2010, 20:00) *
Для чего создавать два объекта MainWindow?
и при этом показывать (show()) только один из них

Автор: PunX 12.4.2010, 16:04

Если сделать show() для объекта db то приложение рушиться.

Автор: PunX 12.4.2010, 19:58

На данный момент у меня в MainWindow 2 конструктора

MainWindow(QWidget *parent);
MainWindow(QString db_l, QString db_n);

вот и получается что создаю 2 объекта. Как объеденить эти конструкторы в один?

Автор: BRE 12.4.2010, 19:59

Цитата(PunX @ 12.4.2010, 20:58) *
На данный момент у меня в MainWindow 2 конструктора

Покажи, что у тебя в этих конструкторах.

Автор: PunX 12.4.2010, 20:02

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::MainWindow(QString db_l, QString db_n)
{
    db_login = db_l;
    db_name = db_n;
}

Автор: BRE 12.4.2010, 20:05

Первый консруктор тебе не нужен, ведь ты должен обязательно получить db_login и db_name.

MainWindow::MainWindow(QString db_l, QString db_n, QWidget *parent ) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    db_login( db_l ),
    db_name( db_n )
{
    ui->setupUi(this);
}


Автор: PunX 12.4.2010, 20:18

Я наверное уже замучал всякими вопросами дурацкими, но довести до конца и разобраться хочется, определил такой конструктор вместо тех двух, теперь создаю объект
MainWindow m(db_login,db_name); такой вариант конечно же не пойдёт
но и такой MainWindow m(db_login,db_name,QWidget *parent); тоже не проходит.

Автор: BRE 12.4.2010, 20:21

В файле mainwindow.h декларируй его так:

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow::MainWindow( QString db_l, QString db_n, QWidget *parent = 0 );
};


Автор: PunX 12.4.2010, 20:28

О, заработало :) Спасибо!
Но пока сыплються ворнинги

mainwindow.h:23: warning: 'MainWindow::ui' will be initialized after
на строку Ui::MainWindow *ui;
mainwindow.h:14: warning:   'QString MainWindow::db_login'
на строку QString db_login;
mainwindow.cpp:5: warning:   when initialized here
строка MainWindow::MainWindow(QString db_l, QString db_n, QWidget *parent ) .....

Автор: BRE 12.4.2010, 20:35

Покажи, что у тебя в mainwindow.h и mainwindow.cpp.

Автор: Litkevich Yuriy 12.4.2010, 20:36

Цитата(PunX @ 12.4.2010, 23:58) *
вот и получается что создаю 2 объекта.
а почему это вдруг так получается, для создания объекта нужен один конструктор, а какой из нескольких имеющихся выбрать тебе решать. Собственно их и делают несколько (перегружают), чтобы в разных ситуациях использовать. В одной ситуации нужен один, а в другой ситуации - другой




Цитата(PunX @ 13.4.2010, 0:28) *
mainwindow.h:23: warning: 'MainWindow::ui' will be initialized after
подобное сообщение компилятор пишет, для случая, когда ты используешь список инициализации:
Цитата
MainWindow::MainWindow(QString db_l, QString db_n, QWidget *parent ) :
QMainWindow(parent),
ui(new Ui::MainWindow), //
db_login( db_l ), // идёт вторым
db_name( db_n ) // идёт третим
В этом списке последовательность членов класса должна совпадать с последовательностью их объявления:
Цитата
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow::MainWindow( QString db_l, QString db_n, QWidget *parent = 0 );

private:
Ui::MainWindow *ui;
...
QString db_name; //идёт вторым
...
QString db_login; // идёт третим

};
как видишь тут последовательность отличается, а должна совпадать. Переставь либо в заголовочнике либо в списке инициализации. И всё будет путём

Автор: PunX 12.4.2010, 20:45

Спасибо большое за "разжёвывание" матерьяла и за терпение!

Автор: Litkevich Yuriy 12.4.2010, 20:49

я предлагаю тему переместить из Qt в технику программирования, т.к. тут вопросы только по С/С++

Автор: danya 1.11.2010, 23:34

Цитата(Litkevich Yuriy @ 22.3.2010, 11:38) *
обычно данные из диалоговых окон передаются в главное, по закрытию диалогового окна.
Для этого в диалоговом окне предусматривают методы чтения данных.
Например, для чтения текста из LoginSysDialog::LineEditName, можно написать метод LoginSysDialog::name, тогда в главном окне после закрытия диалога просто вызываешь этот метод.
Вот у меня диалог ввода имени пользователя и пароля:
class DialogLogin : public QDialog, public Ui::DialogLogin
{
    Q_OBJECT
public:
    DialogLogin(QWidget* parent= 0);
    
    QString    login() const;
    QString    password() const;
};
Вот так используется в главном окне:
DialogLogin    loginDialog(this);

if (loginDialog.exec() == QDialog::Accepted)
{
    login=loginDialog.login();
    pswd=loginDialog.password();
}

можете поподробнее описать мне также необходимо передать значения из диалога в основную форму
в чем у меня ошибка?
Раскрывающийся текст
#ifndef NEWDOG_H
#define NEWDOG_H

#include <QDialog>

namespace Ui {
    class newdog;
}

class newdog : public QDialog
{
    Q_OBJECT

public:
    explicit newdog(QWidget *parent = 0);
    ~newdog();
    QString aname() const;


private:
    Ui::newdog *ui;

private slots:
    void on_buttonBox_accepted();
};

#endif // NEWDOG_H

#include "newdog.h"
#include "ui_newdog.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"

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


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

void newdog::on_buttonBox_accepted()
{

}

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "newdog.h"
#include "QDialog"

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

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

void MainWindow::on_pushButton_2_clicked()
{
    QString name;
    newdog form(this);

    if (form.exec() == QDialog::Accepted)
    {
        name=form.aname();
    }
    ui->label->setText(name);
}

void MainWindow::on_pushButton_2_clicked(bool checked)
{

}


Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)