2013-04-16 6 views
0

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

Я тестирую несколько вещей с 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();} 
} 

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

+0

Можете ли вы публиковать ошибки компиляции? – Phlucious

ответ

0

Итак, я пытался решить эту проблему, и я решил сделать слот, возвращающий значение bool всякий раз, когда textEdit понес изменения. Как я понял, я думал об использовании этого в качестве теста всякий раз, когда срабатывало «Новое действие». Итак, после теста, я вернул значение bool обратно в 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; 
}
1

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

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

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

+0

Это более или менее то, что я собирался сказать. Я бы добавил, что подключение [QTextEdit :: textChanged()] (http://qt-project.org/doc/qt-4.8/qtextedit.html#textChanged) к слову 'setDirty()', который отмечает активный документ так как грязный (нуждающийся в спасении) сделает «управление грязью» очень простым. Как только вы загрузите другой документ или сохраните текущий, вы должны называть 'setDirty (false)', чтобы пометить его как чистый. – Phlucious

+0

ATM, я только читаю или пишу в виджет QTextEdit с помощью диалоговых окон «Сохранить/Открыть». Может ли кто-нибудь объяснить, как я могу передать существующую ссылку виджета QTextEdit на оператор if if? На данный момент у меня нет класса документа, и мой подход пытался напрямую обрабатывать только содержимое виджета, не думая о том, что этот контент является «документом». – Joum

+0

Это зависит от того, как вы создали экземпляр 'QTextEdit' и как вы его называете, если вы можете опубликовать этот раздел кода, я могу вам сказать. –