2014-10-29 2 views
1

У меня есть tabwidget с QTextEdit с именем объекта как «text_field» (Set through Qt Designer). Он находится внутри одной вкладки. Например, в текстовом редакторе файлы открываются на нескольких вкладках. Я хочу повторить это. Поэтому всякий раз, когда я нажимаю кнопку «Новый файл», она должна программно создавать другую вкладку с новым полем 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

Все ваши текстовые элементы хранятся в 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

+0

@Bhavyanshu currentWidget возвращает QWidget, поэтому вы не можете использовать этот виджет, поскольку textEdit без кастинга и проверки является отличным. Если вы хотите использовать его, вы должны использовать его, вы можете предоставить функцию для этого одним вызовом этой функции (но почему?). Вы не можете сделать это более глобально, потому что вы всегда должны получать фактический виджет, а не один виджет, который вы задали в своем вопросе. – Chernobyl

+0

Хорошо, спасибо за объяснение. Также я полностью избавился от первого QTextEdit, который добавлен через Qt Designer. Теперь я создаю новую вкладку и QTextEdit прямо через функцию void MainWindow :: on_actionNew_triggered(). Я думаю, что это еще лучше. Большое спасибо за помощь! – Bhavyanshu

Смежные вопросы