Динамика слота/сигнала относительно QTextEdit

Я новичок в C++/Qt, и у меня есть только небольшой опыт веб-разработки.

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

Итак, у меня есть основной пользовательский интерфейс программы, в который я поместил виджет QTextEdit. Теперь я пытаюсь воспроизвести одно из этих предупреждений «в документе есть изменения, лучше сохраните его!», и оно отображается каждый раз, когда кто-то пытается создать новый документ.

Я пытаюсь проверить изменения в виджете textEdit, когда срабатывает опция «Новый документ». Я продолжаю получать эти ошибки компиляции, и я даже не знаю, что они означают! Каким будет правильное условие теста? Как я могу ссылаться на textEdit, если он вызывается где-то еще?

Я пытаюсь что-то вроде этого:

void Notepad::on_actionNew_triggered()
{
    //not getting the test condition right!

    if(................................) {

    QMessageBox msgBox;
    msgBox.setText("Warning!");
    msgBox.setInformativeText("Changes were applied to this document.");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        switch (ret) {
            case QMessageBox::Discard:
                // Don't Save was clicked
                ui->textEdit->clear();
                break;
            case QMessageBox::Cancel:
                msgBox.close();
                break;
            default:
                // should never be reached
                break;
        }
    }else{ui->textEdit->clear();}
}

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


person Joum    schedule 16.04.2013    source источник
comment
Можете ли вы опубликовать ошибки компиляции?   -  person Phlucious    schedule 16.04.2013


Ответы (2)


Итак, у вас есть несколько вещей в игре здесь. Во-первых, когда вы нажимаете New, вам нужно выполнить проверку, чтобы увидеть, есть ли уже существующий документ, который не был сохранен, вы не за горами, подумав о сигнале и слотах для него.

Поэтому, когда вы нажимаете New, вам нужно отправить сигнал в ваш документ, если вы создали собственный класс, это легко, так как вы можете добавить новый слот dirtyDocument (например!), который может передавать статус документов обратно, например, с помощью испускать другой сигнал, содержащий флаг bool, и обрабатывать его внутри другого слота. Или в вашем слоте on_actionNew_triggered вы можете спросить объект документа, который в данный момент открыт, есть ли в нем несохраненные изменения, передав ссылку на объект или сохранив ссылку на класс на него (вот где у вас есть что-то вроде Document *doc; в вашем файле notepad.h ).

Если у вас возникают проблемы с компиляцией, скопируйте любую информацию, не относящуюся к вашему коду, и вставьте ее в Google. Скорее всего, кто-то задаст тот же вопрос, скорее всего, на самом SO.

person Nicholas Smith    schedule 16.04.2013
comment
Это примерно то, что я собирался сказать. Я бы добавил, что подключение QTextEdit::textChanged() в слот setDirty(), который помечает активный документ как грязный (требующий сохранения), упростит управление загрязнением. Как только вы загрузите другой документ или сохраните текущий, вы должны вызвать setDirty(false), чтобы пометить его как чистый. - person Phlucious; 16.04.2013
comment
ATM, я читаю или записываю в виджет QTextEdit только с помощью системных диалогов сохранения/открытия. Может ли кто-нибудь объяснить, как я могу передать существующую ссылку на виджет QTextEdit оператору условия if? У меня пока нет класса документа, и мой подход заключался в том, чтобы напрямую обрабатывать только содержимое виджета, не думая об этом содержимом как о документе. - person Joum; 17.04.2013
comment
Это зависит от того, как вы создали экземпляр своего виджета QTextEdit и как вы его вызываете, если вы также можете опубликовать этот раздел кода, я могу вам сказать. - person Nicholas Smith; 17.04.2013

Итак, я пытался решить эту проблему, и я решил сделать слот, возвращающий логическое значение всякий раз, когда textEdit претерпевает изменения. Как я понял, я думал об использовании этого в качестве теста всякий раз, когда срабатывало «Новое действие». Итак, после теста я вернул логическое значение в false, и оно работает нормально:

void Notepad::on_actionNew_triggered()
{    
    if(Notepad::on_textEdit_textChanged()) {
    ~Notepad::on_textEdit_textChanged(); 
    QMessageBox msgBox;
    msgBox.setText("Warning!");
    msgBox.setInformativeText("Changes were applied to this document.");
    msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Cancel);
    int ret = msgBox.exec();


        switch (ret) {
            case QMessageBox::Discard:
                // Don't Save was clicked
                ui->textEdit->clear();
                break;
            case QMessageBox::Cancel:
                msgBox.close();
                break;
            default:
                // should never be reached
                break;
        }
    }else{ui->textEdit->clear();}
}

bool Notepad::on_textEdit_textChanged()
{
    return true;
}
person Joum    schedule 17.04.2013