2012-04-19 34 views
1

我有一个在Qt中制作的应用程序。这是一个irc客户端。所以基本上,我有一个listwidget的联系人列表和另一个聊天列表。我还创建了一个lineEdit和一个按钮。当我双击一个项目时,它会打开另一个选项卡。在此之前,这很好。当用户输入/连接到它时,它会打开一个名为toto的选项卡(这是一个新频道)。问题是,当我打开一个新选项卡时,我为这个新选项卡重新创建每个小部件(列表,lineEdit,按钮)。因此,当用户从标签中键入/连接toto时,他无法在此标签上发送任何内容。但他可以在新创建的选项卡上完成。QTabWidget从一个标签复制窗口小部件到另一个

我不知道为什么它这样做,所以如果你能帮助我,这是伟大的,谢谢:P

这里是我创建的新标签的代码。每个var都是一个类var。

newTab = new QWidget(ui->tabWidget); 
    pushButton = new QPushButton("Envoyer", newTab); 
    connect(pushButton, SIGNAL(clicked()), this, SLOT(clicked())); 
    pushButton->setGeometry(976, 705, 121, 27); 
    chatListView = new QListView(newTab); 
    chatListView->setGeometry(10, 10, 891 ,681); 
    contactListView = new QListWidget(newTab); 
    contactListView->setGeometry(910, 10, 251, 681); 
    lineEdit = new QLineEdit(newTab); 
    lineEdit->setGeometry(10, 705, 891, 27); 
    connect(lineEdit, SIGNAL(returnPressed()), pushButton, SLOT(click())); 
    ui->tabWidget->addTab(newTab, name); 
+0

这里没有什么指示哪里出了问题会。它可能在处理SLOT的代码中。您应该尝试调试这些插槽以查看是否所有选项卡都触发了它们。 – jdi 2012-04-19 19:30:10

+0

他们不是。我认为这是因为我在这里重新宣布每一个变量(代码在那里),所以它会破坏旧的变量。 – 2012-04-19 19:52:32

回答

1

将所有这些代码移动到QWidget的自定义子类中。然后,每当您想要制作新标签时,只需创建一个全新的自定义小部件实例即可。

请注意,现在您不断引用类实例属性而不是全新的对象。您不应每次都替换相同的newTab属性。它最有可能打破你的连接参考。

你最终会像这样的东西:

MyTabWidget *tabWidget = new MyTabWidget(this); 
connect(tabWidget->pushButton, SIGNAL(clicked()), this, SLOT(clicked())); 
connect(tabWidget->lineEdit, SIGNAL(returnPressed()), pushButton, SLOT(click())); 
ui->tabWidget->addTab(tabWidget, name); 
+0

是的,这就是我想要的...... 你认为我应该在这样的地图中保留我的标签列表吗? 'std :: map ' 当我打开一个新选项卡时,我必须检查具有相同名称的选项卡尚未打开。但是,如果我这样做,我不会有迭代器:( – 2012-04-19 22:29:43

+0

当你所要做的只是通过QTabWidget.count()的for循环并且用'QTabWidget.tabText(i)检查名称时,创建映射似乎完全没有必要。 ' – jdi 2012-04-19 22:46:13

相关问题