Задать вопрос
@AflameGhost

Ui не работает в новом классе QT. Что делать?

Необходимо было создать дополнительный класс (помимо MainWindow), который бы создавал файл с названием, введённым через LineEdit, после нажатия pushButton. Файл создаётся, но считывание названия происходит до его введения в LineEdit (соответственно, создаётся файл без названия .txt).
Перепробовал много чего: наследование MyClass от MainWindow, вызывать метод считывания из MainWindow, пытался реализовать ввод через сигналы и слоты->все безуспешно.
Есть мысли, что проблема в нулевом указателе Ui::MainWindow *ui, также пытался исправить, но безуспешно.

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QMainWindow>
namespace Ui{
class MainWindow;
}

Class MyClass : public QMainWindow
{
    Q_OBJECT
public:
    Ui::MainWindow *ui = new Ui::MainWindow;
public slots:
    void newSlot();
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MyClass q;
    explicit MainWindow(QWidget *parent= 0);
~MainWindow();
    Ui::MainWindow *ui;
};
#endif //MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv) ;
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <fstream>
#include <iostream>
#include <QFileInfo>
#include <QTextStream>
#include <QLineEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui (new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), &q, SLOT(newSlot()));
};

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

void MyClass::newSlot()
{
    ui->setupUi(this);
    QString str=ui->lineEdit->text();
    QFile file(str.toUtf8()+”.txt”);
    if (file.open(QIODevice::WriteOnly)){
        QString r=QFileInfo(“.txt”).absolutePath();
        QTextStream out (&file);
        out<<r.toUtf8()<<endl;}
    file.close();
}
  • Вопрос задан
  • 680 просмотров
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@SHakeR
Файл создаётся, но считывание названия происходит до его введения в LineEdit

Считывание происходит, только происходит оно из поля формы класса MyClass (которое не выведено на экран, не заполнено и, соответственно, пустое), а вводите значение Вы в поле формы класса MainWindow.
Проще всего сделать так:
Class MyClass : public QMainWindow
{
    Q_OBJECT
public:
    Ui::MainWindow *ui = new Ui::MainWindow;
public slots:
    void newSlot(QString fileName)
    {
        QFile file(fileName.toUtf8()+”.txt”);
        if (file.open(QIODevice::WriteOnly)){
            QString r=QFileInfo(fileName.toUtf8()+“.txt”).absolutePath();
            QTextStream out (&file);
            out<<r.toUtf8()<<endl;
        }
        file.close();
    }
};


и в mainwindow.cpp связать сигнал со слотом так:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui (new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked, this, [this](){
        q.newSlot(ui->lineEdit->text());
    });
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы