【问题标题】:Slot/signal dynamics regarding QTextEdit关于 QTextEdit 的时隙/信号动态
【发布时间】:2013-04-16 14:10:44
【问题描述】:

我是 C++/Qt 的新手,我只有一些 Web 开发经验。

出于学习目的,我正在使用 Qt 测试一些东西,但我失败了。我很确定这是因为整个插槽/信号的事情还没有解决,所以我希望有人可以让我更清楚。

所以,我有这个主程序 UI,我在其中放置了一个 QTextEdit 小部件。现在我正在尝试重现其中一个“文档有更改,最好保存它!”-警告,并且每次有人尝试创建新文档时都会显示它。

我正在尝试在触发“新文档”选项时测试 textEdit 小部件中的更改。我不断收到这些编译错误,我什至不知道它们是什么意思!什么是正确的测试条件?我如何引用 textEdit,因为它在其他地方被调用?

我正在尝试这样的事情:

无效记事本::on_actionNew_triggered() { //没有得到正确的测试条件! 如果(................................) { QMessageBox 消息框; msgBox.setText("警告!"); msgBox.setInformativeText("更改已应用于此文档。"); msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); int ret = msgBox.exec(); 开关(ret){ 案例 QMessageBox::Discard: // 不保存被点击 ui->textEdit->clear(); 休息; 案例 QMessageBox::取消: msgBox.close(); 休息; 默认: // 永远不应该到达 休息; } }else{ui->textEdit->clear();} }

我已尝试搜索有关此问题的一些信息,我敢打赌,你们中的大多数人实际上可能认为这很明显,但我很难理解如何解决这个问题。

【问题讨论】:

  • 你能发布编译错误吗?

标签: qt signals-slots qtextedit textchanged


【解决方案1】:

所以,这里有一些东西在起作用。一个是当您单击New 时,您需要执行检查以查看是否存在尚未保存的文档,通过考虑信号和插槽,您离它不远了。

因此,当您按下 New 时,您需要向文档发送信号,如果您创建了自定义类,这很容易,因为您可以添加一个新插槽 dirtyDocument(例如!),它可以中继记录状态,例如通过发出另一个包含bool 标志的信号并在另一个插槽中处理它。或者,在您的 on_actionNew_triggered 插槽中,您可以通过传递对对象的引用或维护对它的类引用来询问当前打开的文档对象是否有未保存的更改(这就是您的 Document *doc; 在您的notepad.h 文件)。

如果您遇到编译问题,请复制任何与您的代码无关的信息并将其粘贴到 Google。很可能有人会问同样的问题,很可能是关于 SO 本身。

【讨论】:

  • 这或多或少是我要说的。我要补充一点,将QTextEdit::textChanged() 连接到将活动文档标记为脏(需要保存)的setDirty() 插槽将使“脏度管理”变得非常容易。加载另一个文档或保存当前文档后,您将调用 setDirty(false) 将其标记为干净。
  • ATM,我只使用保存/打开系统对话框读取或写入 QTextEdit 小部件。谁能解释我如何将现有的 QTextEdit 小部件引用传递给 if 条件语句?我现在没有文档类,我的方法是尝试直接处理小部件的内容,而不是将这些内容视为“文档”。
  • 这取决于您如何实例化您的 QTextEdit 小部件以及您如何调用它,如果您也可以发布那段代码,我可以告诉您。
【解决方案2】:

所以,我试图解决这个问题,并决定在 textEdit 发生更改时创建一个返回布尔值的插槽。正如我所知道的,每当触发“新操作”时,我都想将其用作测试。所以,在测试之后,我将 bool 值设置回 false 并且它工作正常:

无效记事本::on_actionNew_triggered() { 如果(记事本::on_textEdit_textChanged()){ ~记事本::on_textEdit_textChanged(); QMessageBox 消息框; msgBox.setText("警告!"); msgBox.setInformativeText("更改已应用于此文档。"); msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); int ret = msgBox.exec(); 开关(ret){ 案例 QMessageBox::Discard: // 不保存被点击 ui->textEdit->clear(); 休息; 案例 QMessageBox::取消: msgBox.close(); 休息; 默认: // 永远不应该到达 休息; } }else{ui->textEdit->clear();} } 布尔记事本::on_textEdit_textChanged() { 返回真; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多