【问题标题】:Programmatically creating a new QTextEdit inside a new tab以编程方式在新选项卡中创建新的 QTextEdit
【发布时间】:2014-12-25 16:08:31
【问题描述】:

我有一个带有 QTextEdit 的 tabwidget,其对象名称为“text_field”(通过 Qt 设计器设置)。它在一个标签内。例如,在文本编辑器中,文件在多个选项卡中打开。我想复制这个。因此,每当我按下“新建文件”按钮时,它应该以编程方式创建另一个带有新 QTextEdit 字段的选项卡。 到目前为止,我编写的所有函数都使用上述对象名称,例如

void MainWindow::some_function() {
    ...
    ui->text_field->textCursor();
    ...
}

如您所见,我以错误的方式处理此问题。问题是,当我按下“新建文件”按钮时,如何为新创建的 QTextEdit 设置相同的对象名称?

我试过这样的。

void MainWindow::on_actionNew_triggered()
{
    QTextEdit *text_field = new QTextEdit();
    ui->tabWidget->addTab(text_field,"Untitled.txt");
    ui->tabWidget->setCurrentWidget(text_field);
}

结果是它正在创建新选项卡,还添加了一个 QTextEdit 小部件,但这些功能仅适用于最初创建的 QTextEdit 而不是以编程方式创建的。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您所有的 textEdits 都存储在 tabWidget 中,因此您可以在任何地方轻松访问此小部件,只需传递所需小部件的索引,您就可以做所有您需要的事情。

    示例如何使用。

    for(int i = 0; i< ui->tabWidget->count(); i++ )
    {
        qDebug() << ui->tabWidget->widget(i);
        QTextEdit* edit = qobject_cast<QTextEdit*>(ui->tabWidget->widget(i));
        if(edit)
            edit->setText("new");
    }
    

    在你的例子中:

    void MainWindow::some_function() {
        ...
        ui->text_field->textCursor();
        ...
    }
    

    您仅使用在 Qt Designer 中创建的小部件,我的示例仅使用索引或仅使用 currentIndex()currentWidhet() 方法,您可以使用这些方法。文本编辑。

    主要思想是用户可以添加许多小部件,您无法预测用户想要多少,但tabWidget存储所有小部件,所以使用它!

    【讨论】:

    • 所以我必须在每个函数中添加QTextEdit *te = qobject_cast&lt;QTextEdit*&gt;(ui-&gt;tabWidget-&gt;currentWidget());?有没有办法在全球范围内完成这项工作?
    • @Bhavyanshu currentWidget 返回 QWidget,因此您不能将此小部件用作 textEdit 而不进行投射,并且检查是否投射成功。如果你想使用它,你应该强制转换,你可以通过调用这个函数来提供函数来做到这一点(但为什么?)。你不能在全局范围内这样做,因为你总是应该得到实际的小部件,而不是你在问题中设置的一个小部件。
    • 好的,谢谢您的解释。此外,我已经完全摆脱了通过 Qt Designer 添加的第一个 QTextEdit。现在我正在通过void MainWindow::on_actionNew_triggered() 函数直接创建新选项卡和 QTextEdit。我认为这仍然是一个更好的功能。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 2021-11-04
    • 2011-07-24
    • 1970-01-01
    • 2020-12-03
    • 2010-10-29
    • 2010-09-30
    相关资源
    最近更新 更多