避免 QTabWidget 中的重复选项卡
Posted
技术标签:
【中文标题】避免 QTabWidget 中的重复选项卡【英文标题】:Avoid duplicate Tabs in QTabWidget 【发布时间】:2013-11-26 06:07:13 【问题描述】:我有一个应用程序,我在其中添加了一个 QTabWidget。 标签是可关闭的。 当我添加新选项卡时,如果该选项卡已添加,它仍会添加新选项卡并进行复制。 我想避免这种重复。 如果该选项卡已经打开,那么它只是激活该选项卡并且不会再次打开。 您的帮助将不胜感激。 谢谢
【问题讨论】:
【参考方案1】:要补充 Prakash 的答案,请注意有时选项卡标题不是选项卡内容的良好标识符(这当然取决于具体情况)。例如,您可能有一个文件管理器,其中当前目录是选项卡的标题,但在您的文件系统中可能存在同名的不同目录。
我将遵循以下策略来识别选项卡内容:Qt 允许您为小部件设置动态属性(请参阅QObject::setProperty),因此每次创建新选项卡时,例如文件管理器,您可能会做一些事情喜欢
widget = ...
widget->setProperty("tab_dir_fullpath", the_full_path);
tabWidget->addWidget(widget, directory_name);
其中the_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.
【讨论】:
【参考方案2】:在添加新选项卡之前使用 tabText(int index) 获取每个选项卡的标识符 addTab(QWidget * page, const QString & label) 并比较标签文本,如果已经存在,只需设置该索引的当前索引,否则添加一个新标签。
【讨论】:
我已经做到了。 for(int i=0;i使用 setTabData() 代替属性也非常好,这是更正确的做法。
【讨论】:
【参考方案4】:受 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);
【讨论】:
以上是关于避免 QTabWidget 中的重复选项卡的主要内容,如果未能解决你的问题,请参考以下文章
通过单击 QTabWidget 外部的按钮,将每个选项卡(QTabWidget)中的数组保存到 QTabWidget 外部的二维数组