我有一个应用程序,其中添加了一个 QTabWidget。标签是可关闭的。当我添加新选项卡时,如果该选项卡已添加,它仍会添加新选项卡并进行复制。我想避免这种重复。如果选项卡已经打开,那么它只是激活该选项卡而不会再次打开。您的帮助将不胜感激。谢谢
问问题
1715 次
4 回答
2
要在 Prakash 的答案之上添加,请注意有时选项卡标题不是选项卡内容的良好标识符(这当然取决于情况)。例如,您可能有一个文件管理器,其中当前目录是选项卡的标题,但在您的文件系统中可能存在同名的不同目录。
我将遵循以下策略来识别选项卡内容:Qt 允许您为小部件设置动态属性(请参阅QObject::setProperty),因此每次创建新选项卡时,例如文件管理器,您可能会执行类似的操作
widget = ...
widget->setProperty("tab_dir_fullpath", the_full_path);
tabWidget->addWidget(widget, directory_name);
wherethe_full_path
将是一个唯一标识符(在此示例中,当前目录的完整绝对路径),它不会显示给用户,但您可以稍后使用它来查看给定目录是否已经打开。
然后,在打开新选项卡时,您应该检查是否已打开相同的完整路径:
for (int k = 0; k < tabWidget->count(); ++k) {
if (tabWidget->widget(k)->property("tab_dir_fullpath").toString() == the_full_path_to_open) {
tabWidget->setCurrentIndex(k);
return;
}
}
... // open new tab, as in the previous snippet.
于 2013-11-26T12:40:42.417 回答
1
在添加新选项卡之前使用 tabText(int index) 获取每个选项卡的标识符 addTab(QWidget * page, const QString & label) 并比较标签文本,如果已经存在,则只需设置该索引的当前索引或添加新选项卡.
于 2013-11-26T06:20:34.267 回答
0
使用 setTabData() 代替属性也很好,这是更正确的做法。
于 2014-07-04T11:42:28.333 回答
0
受 Noor Nawaz 评论的启发,我的方法是:
void MainWindow::openPanel1()
{
for(int i=0;i<ui->tabWidget->count();i++) {
if(ui->tabWidget->tabText(i) == "Panel1") {
ui->tabWidget->setCurrentIndex(i);
return;
}
}
Panel1 = new panel1Widget();
int index = ui->tabWidget->addTab(Panel1,"Panel1");
ui->tabWidget->setCurrentIndex(index);
}
于 2021-06-03T10:22:22.340 回答