Как реализовать кнопку “Сохранить” на Qt?

107
13 декабря 2019, 01:30

Делаю текстовый редактор. Дошел до кнопки «Сохранить»

Есть фрагмент кода

В заголовочном файле

// ...
    QPushButton *SaveButton;
private slots:
    void slotSaveClicked();

В реализации (конструктор)

    //...
    SaveButton = new QPushButton("Сохранить");
    connect(SaveButton, SIGNAL (clicked()), this, SLOT(slotSaveClicked()));

За классом. Описание слота

void MainClass::slotSaveClicked() {
    QTextDocumentWriter writer;
    writer.setFormat("odf");
    writer.setFileName("output.odf");
    writer.write(MainTextEdit->document());
}

Нужно сделать так, чтобы при нажатии на кнопку, содержимое текстового поля записывалось в файл output.odf, который создается программно.

QtGui, QTextDocumentWriter и другие заголовочные файлы поддключены. Кнопка «Сохранить» не работает. Ничего при ее нажатии не происходит.

При этом ошибок компилятор не выдает. Что добавить в код?

Проверяю так:

void MainClass::slotSaveClicked(bool slot){
    slot = false;
    if (slot == false) {
        std::cout << "Слот вызван";
    }
    else {
        std::cout << "Ошибка вызова слота";
    }
}
Answer 1

Проблема очевидна:

SaveButton = new QPushButton("Сохранить");
connect(SaveButton, SIGNAL (clicked()), this, SLOT(slotSaveClicked()));

Вы указываете, что хотите соединить кнопку с слотом slotSaveClicked() без аргументов.

Но тут же показываете свой слот, у которого сигнатура:

void MainClass::slotSaveClicked(bool slot)

Нестыкововка. Поменяйте сигнатуру своего слота на:

void MainClass::slotSaveClicked()

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

 connect(SaveButton, &QPushButton::clicked, this, &MainWindow::slotSaveClicked);
READ ALSO
Результат screencap RAW в Bitmap

Результат screencap RAW в Bitmap

Screencap на Android умеет отдавать RAW картинку, как я понимаю, это framebuffer с заголовкомКак правильно привести данные RAW к формату Bmp?

139
Как подключить к Visual Studio 2017 ODB, работающий с SQLite

Как подключить к Visual Studio 2017 ODB, работающий с SQLite

Одна программа, включающая хэдер с классами и его cpp с методами, генерирует данныеНеобходимо эти данные сохранять в БД

115
Правильный способ обратиться к полю не выровненного объекта

Правильный способ обратиться к полю не выровненного объекта

Не могу найти однозначного ответа на следующий вопрос

105