Получить текстовые поля с другой формы



  • Здравствуйте. Есть widget MainWindow и есть виджет Form, при нажатии на кнопку в MainWindow создается объект Form. Как мне из этой Form получить поля lineEdit но в классе MainWindow.
    mainwindows.h
    @#ifndef MAINWINDOWS_H
    #define MAINWINDOWS_H

    #include <QMainWindow>
    #include "form.h"
    #include "list.h"
    #include <QtGui>
    #include <QtWidgets>

    class QLabel;
    class QLineEdit;
    class QPushButton;
    class QTreeWidget;
    namespace Ui {
    class MainWindows;
    }

    class MainWindows : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindows(QWidget *parent = 0);
    ~MainWindows();
    private:
    QPushButton *addCategory;
    QPushButton *addItem;
    QTreeWidget *treeWidget;
    private slots:
    void showAddForm();

    private:
    Ui::MainWindows *ui;
    };

    #endif // MAINWINDOWS_H
    @
    mainwindows.cpp
    @#include "mainwindows.h"
    #include "ui_mainwindows.h"
    MainWindows::MainWindows(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindows)
    {
    ui->setupUi(this);
    QWidget *window_widget = new QWidget();
    QVBoxLayout *main_layout = new QVBoxLayout;
    QHBoxLayout *top_part = new QHBoxLayout;
    addItem = new QPushButton("Добавить товар");
    top_part->addWidget(addItem);
    top_part->addStretch();
    QHBoxLayout *treelayout = new QHBoxLayout;

    treeWidget = new QTreeWidget;
    treelayout->addWidget(treeWidget);
    main_layout->addLayout(top_part);
    main_layout->addLayout(treelayout);
    window_widget->setLayout(main_layout);
    connect(addItem, SIGNAL(clicked()), this, SLOT(showAddForm()));
    treeWidget->setColumnCount(3);
    QStringList lst;
    lst << "Наименование" << "Кол-во." << "Цена";
    treeWidget->setHeaderLabels(lst);
    setCentralWidget(window_widget);
    

    }
    void MainWindows::showAddForm()
    {
    Form *form_add = new Form();
    form_add->setWindowTitle("Добавление товара");
    form_add->setFixedWidth(500);
    form_add->setFixedHeight(150);
    form_add->show();

    connect(submitButton, SIGNAL(clicked()), form_add, SLOT(closeEvent()));
    QTreeWidgetItem *newItem = new QTreeWidgetItem;
    newItem->setText(0, "Категория 1");
    treeWidget->addTopLevelItem(newItem);
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, name_edit->text());
    sub->setText(1, price_edit->text());
    sub->setText(3, kol_edit->text());
    

    }

    MainWindows::~MainWindows()
    {
    delete ui;
    }
    @
    form.h
    @#ifndef FORM_H
    #define FORM_H

    #include <QWidget>
    #include "mainwindows.h"
    class QLabel;
    class QPushButton;
    class QLineEdit;
    namespace Ui {
    class Form;
    }

    class Form : public QWidget
    {

    Q_OBJECT
    

    public:
    explicit Form(QWidget *parent = 0);
    ~Form();
    QLabel *name_label;
    QLabel *kol_label;
    QLabel *price_label;
    QPushButton *submitButton;
    QPushButton *resetButton;
    QLineEdit *name_edit;
    QLineEdit *kol_edit;
    QLineEdit *price_edit;

    private:
    Ui::Form *ui;

    private slots:
    void closeEvent();
    };

    #endif // FORM_H

    @
    form.cpp
    @#include "form.h"
    #include "ui_form.h"
    #include "mainwindows.cpp"
    Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
    {
    ui->setupUi(this);
    QHBoxLayout *top_layout = new QHBoxLayout;
    QHBoxLayout *bottom_layout = new QHBoxLayout;
    QVBoxLayout *main_layout = new QVBoxLayout;
    QVBoxLayout *right_col = new QVBoxLayout;
    QVBoxLayout *left_col = new QVBoxLayout;
    name_label = new QLabel("Название товара: ");
    name_edit = new QLineEdit;
    left_col->addWidget(name_label);
    right_col->addWidget(name_edit);

    price_label = new QLabel("Цена: ");
    price_edit = new QLineEdit;
    left_col->addWidget(price_label);
    right_col->addWidget(price_edit);
    kol_label = new QLabel("Количество: ");
    kol_edit = new QLineEdit;
    left_col->addWidget(kol_label);
    right_col->addWidget(kol_edit);
    top_layout->addLayout(left_col);
    top_layout->addLayout(right_col);
    submitButton = new QPushButton("Добавить");
    resetButton = new QPushButton("Отменить");
    
    main_layout->addLayout(top_layout);
    bottom_layout->addWidget(submitButton);
    bottom_layout->addWidget(resetButton);
    main_layout->addLayout(bottom_layout);
    this->setLayout(main_layout);
    

    }

    void Form::closeEvent() {

    this->close();
    }

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

    @

    Буду рад помощи!



  • Так как все QLineEdit в public то можно просто использовать оператор доступа (->)

    @
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_edit->text());
    sub->setText(1, form_add->price_edit->text());
    sub->setText(3, form_add->kol_edit->text());
    @



  • После того как пользователь нажал кнопочку "Добавить" на форме Form, то данные формы же уничтожаются. И мы получим пустые поля.
    [quote author="andreyc" date="1409338044"]Так как все QLineEdit в public то можно просто использовать оператор доступа (->)

    @
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_edit->text());
    sub->setText(1, form_add->price_edit->text());
    sub->setText(3, form_add->kol_edit->text());
    @
    [/quote]



  • Я не вижу в приведёном коде где удаляются name_edit, price_edit и kol_edit.
    Но даже если они где ещё удаляются, то вы можете сохранить их значения в closeEvent() и потом использовать эти сохранёные значения.
    Что-то типа
    @
    class Form : public QWidget
    {

    Q_OBJECT
    

    public:
    explicit Form(QWidget *parent = 0);
    ~Form();
    QLabel *name_label;
    QLabel *kol_label;
    QLabel *price_label;
    QPushButton *submitButton;
    QPushButton *resetButton;
    QLineEdit *name_edit;
    QLineEdit *kol_edit;
    QLineEdit *price_edit;

    QString name_str;
    QString kol_str;
    QString price_str;

    private:
    Ui::Form *ui;

    private slots:
    void closeEvent();
    };

    void Form::closeEvent() {
    name_str = name_edit->text();
    price_str = price_edit->text();
    kol_str = kol_edit->text();
    }

    ...
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_str);
    sub->setText(1, form_add->price_str);
    sub->setText(3, form_add->kol_str);
    ...
    @



  • Ну как же не удаляются они? Они принадлежат этой форме. И при this->close(); произойдет вызов деструктора и будет
    @Form::~Form()
    {
    delete ui;
    }
    @
    Попробовал то что Вы посоветовали, снова пусто)



  • Я понял почему оно
    @Form *form_add = new Form();
    form_add->setWindowTitle("Добавление товара");
    form_add->setFixedWidth(500);
    form_add->setFixedHeight(150);
    form_add->show();

    connect(form_add->submitButton, SIGNAL(clicked()), form_add, SLOT(closeEvent()));
    QTreeWidgetItem *newItem = new QTreeWidgetItem;
    newItem->setText(0, "Категория 1");
    treeWidget->addTopLevelItem(newItem);
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_str);
    sub->setText(1, form_add->price_str);
    sub->setText(3, form_add->num_str);@
    

    Происходит сначала просто присоединение слота и сигнала, и дальше идет выполнение кода, добавляется пустой текст не заполненных полей(при открытии окна). Как мне сделать что бы эта часть кода
    @QTreeWidgetItem *newItem = new QTreeWidgetItem;
    newItem->setText(0, "Категория 1");
    treeWidget->addTopLevelItem(newItem);
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_str);
    sub->setText(1, form_add->price_str);
    sub->setText(3, form_add->num_str);
    @
    выполнялась после closeEvent()
    [quote author="andreyc" date="1409342593"]Я не вижу в приведёном коде где удаляются name_edit, price_edit и kol_edit.
    Но даже если они где ещё удаляются, то вы можете сохранить их значения в closeEvent() и потом использовать эти сохранёные значения.
    Что-то типа
    @
    class Form : public QWidget
    {

    Q_OBJECT
    

    public:
    explicit Form(QWidget *parent = 0);
    ~Form();
    QLabel *name_label;
    QLabel *kol_label;
    QLabel *price_label;
    QPushButton *submitButton;
    QPushButton *resetButton;
    QLineEdit *name_edit;
    QLineEdit *kol_edit;
    QLineEdit *price_edit;

    QString name_str;
    QString kol_str;
    QString price_str;

    private:
    Ui::Form *ui;

    private slots:
    void closeEvent();
    };

    void Form::closeEvent() {
    name_str = name_edit->text();
    price_str = price_edit->text();
    kol_str = kol_edit->text();
    }

    ...
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_str);
    sub->setText(1, form_add->price_str);
    sub->setText(3, form_add->kol_str);
    ...
    @[/quote]



  • При this->close() деструктор не вызывается.
    В showAddForm() память под Form выделяется, но не удаляется.

    Что находится в ui?
    Если там есть QLineEdit то возможно что их надо использовать в closeEvent()
    @
    void Form::closeEvent() {
    name_str = ui->name_edit->text();
    price_str = ui->price_edit->text();
    kol_str = ui->kol_edit->text();
    }
    @



  • [quote author="moomot" date="1409343939"]Как мне сделать что бы эта часть кода
    @QTreeWidgetItem *newItem = new QTreeWidgetItem;
    newItem->setText(0, "Категория 1");
    treeWidget->addTopLevelItem(newItem);
    QTreeWidgetItem *sub = new QTreeWidgetItem(newItem);
    sub->setText(0, form_add->name_str);
    sub->setText(1, form_add->price_str);
    sub->setText(3, form_add->num_str);
    @
    выполнялась после closeEvent()[/quote]

    Надо сделать форму из QDialog
    и вызывать form_add->exec()

    @
    class Form : public QDialog
    {
    ...
    }
    @



  • В ui просто пустые формы. Все кнопочки и т.д с помощью кода. Как сделать что бы тот кусок кода выполнялся только после нажатии на кнопку?
    [quote author="andreyc" date="1409344043"]При this->close() деструктор не вызывается.
    В showAddForm() память под Form выделяется, но не удаляется.

    Что находится в ui?
    Если там есть QLineEdit то возможно что их надо использовать в closeEvent()
    @
    void Form::closeEvent() {
    name_str = ui->name_edit->text();
    price_str = ui->price_edit->text();
    kol_str = ui->kol_edit->text();
    }
    @[/quote]



  • [quote author="moomot" date="1409344523"]В ui просто пустые формы. Все кнопочки и т.д с помощью кода. Как сделать что бы тот кусок кода выполнялся только после нажатии на кнопку?
    [/quote]

    Если ui не используется то его лучше вообще убрать.
    Про кусок кода ответил выше :-)
    Используйте QDialog.



  • Сделал QDialog. exec() типо останавливает действие, а после завершения окна - продолжает?)
    [quote author="andreyc" date="1409344698"][quote author="moomot" date="1409344523"]В ui просто пустые формы. Все кнопочки и т.д с помощью кода. Как сделать что бы тот кусок кода выполнялся только после нажатии на кнопку?
    [/quote]

    Если ui не используется то его лучше вообще убрать.
    Про кусок кода ответил выше :-)
    Используйте QDialog.[/quote]



  • QDialog::exec() запускает "модальный диалог":https://ru.wikipedia.org/wiki/Диалоговое_окно

    [EDIT] Да, пока QDialog::exec запущен. приложение не получает мышиных и клавиатурных событий.



  • А как на выбранную категорию добавлять товары, именно на ту которую выбрал мышкой?
    [quote author="andreyc" date="1409345221"]QDialog::exec() запускает "модальный диалог":https://ru.wikipedia.org/wiki/Диалоговое_окно

    [EDIT] Да, пока QDialog::exec запущен. приложение не получает мышиных и клавиатурных событий.
    [/quote]



  • Не понятен вопрос, так как я не в курсе деталей дизайна приложения.



  • @sub = new QTreeWidgetItem(treeWidget->currentItem());@
    Про это я говорил)
    Другой вопрос: как сделать так что бы можно было создавать подкатегории у верхних категорий, а у подкатегорий нельзя создавать категории
    Пример:
    @Категория 1
    -Подкатегория 1
    -Подкатегория 2
    Категория 2
    -Подкатегория 1
    -Подкатегория 2@

    Но что бы нельзя было делать:
    @Категория 1
    -Подкатегория 1
    -Подкатегория подкатегории
    -Подкатегория подкатегории
    -Подкатегория 2
    Категория 2
    -Подкатегория 1
    -Подкатегория 2@
    [UPD] Сделал
    @if(!treeWidget->currentItem()->parent()) {
    sub = new QTreeWidgetItem(treeWidget->currentItem());
    sub->setText(0, form_add->name_edit->text());
    sub->setText(1, form_add->kol_edit->text());
    sub->setText(2, form_add->price_edit->text());
    }@



  • [quote author="moomot" date="1409346633"]
    @
    sub = new QTreeWidgetItem(treeWidget->currentItem());
    @
    Про это я говорил)[/quote]
    Наверно так же как и сейчас. После закрытия диалога прочитать строки и записать в sub.

    [quote author="moomot" date="1409346633"]
    Другой вопрос: как сделать так что бы можно было создавать подкатегории у верхних категорий, а у подкатегорий нельзя создавать категории[/quote]

    Существуют разные способы.
    Например можно для каждой выбранной категории сравнивать "QTreeWidgetItem::parent()":http://qt-project.org/doc/qt-5/qtreewidgetitem.html#parent с "QTreeWidget::invisibleRootItem()":http://qt-project.org/doc/qt-5/qtreewidget.html#invisibleRootItem и если они равны то создавать подкатегорию, а если не равны то низя.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.