2014-10-29 71 views
1

我有一个tabTextEdit对象名称为“text_field”(通过Qt Designer设置)的tabwidget。它在一个标签内。例如,在文本编辑器中,文件在多个选项卡中打开。我想复制这个。所以每当我点击“新建文件”按钮,它应该编程创建一个新的QTextEdit字段的选项卡。 也是所有我写了到目前为止所使用的上述对象名称的功能,如在新选项卡中以编程方式创建新的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,而不是被程序所创建的。

回答

1

所有的textEdit都存储在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()方法创建的,用我的例子小部件的工作。 textEdits。

主要思想是用户可以添加很多小部件,并且无法预测有多少用户需要,但是tabWidget存储所有小部件,因此请使用它!

+0

所以我必须添加'QTextEdit * te = qobject_cast (ui-> tabWidget-> currentWidget());'为每个函数?有没有办法在全球范围内完成这项工作? – Bhavyanshu 2014-10-29 20:49:33

+0

@Bhavyanshu currentWidget返回QWidget,所以你不能使用这个小部件作为文本编辑,而无需投射和检查是铸造成功。如果你想使用它,你应该施放,你可以通过一次调用这个函数来提供这个功能(但是为什么?)。你不能在全球范围内做得更多,因为你总是应该得到实际的部件,而不是你在你的问题中设置的一个部件。 – Chernobyl 2014-10-29 20:58:19

+0

好的,谢谢你解释。此外,我完全摆脱了通过Qt Designer添加的第一个QTextEdit。现在我通过'void MainWindow :: on_actionNew_triggered()'函数直接创建新选项卡和QTextEdit。我认为这仍然是一个更好的功能。非常感谢您的帮助! – Bhavyanshu 2014-10-29 21:06:32

相关问题