C++ QTabWidget将小部件从一个选项卡复制到另一个选项卡时

C++ QTabWidget将小部件从一个选项卡复制到另一个选项卡时,c++,qt,tabwidget,C++,Qt,Tabwidget,我在Qt中/与Qt一起提交了一份申请。这是一个irc客户端。所以基本上我有一个用于联系人列表的listwidget和一个用于聊天列表的listwidget。我还提供了一个线条编辑和一个按钮。当我双击一个项目时,它会打开另一个选项卡。在这里之前,一切都很好。当用户键入/加入toto时,会打开一个名为toto的选项卡(这是一个新频道)。问题是,当我打开一个新选项卡时,我会为这个新选项卡重新创建每个小部件(列表、行编辑、按钮)。因此,当用户从选项卡键入/加入toto时,他无法在此选项卡上发送任何内容。

我在Qt中/与Qt一起提交了一份申请。这是一个irc客户端。所以基本上我有一个用于联系人列表的listwidget和一个用于聊天列表的listwidget。我还提供了一个线条编辑和一个按钮。当我双击一个项目时,它会打开另一个选项卡。在这里之前,一切都很好。当用户键入/加入toto时,会打开一个名为toto的选项卡(这是一个新频道)。问题是,当我打开一个新选项卡时,我会为这个新选项卡重新创建每个小部件(列表、行编辑、按钮)。因此,当用户从选项卡键入/加入toto时,他无法在此选项卡上发送任何内容。但他可以在新创建的选项卡上完成

我不知道它为什么这样做,所以如果你们中有人能帮助我,那就太好了,谢谢: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);

将所有这些代码移动到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);

将所有这些代码移动到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);

这里没有任何东西表明问题出在哪里。它可能在处理插槽的代码中的某个地方。你应该试着调试这些插槽,看看你的所有标签是否都触发了它们。它们不是。我想这是因为我在这里声明了每个变量(上面的代码),所以它在压碎旧的变量。这里没有任何东西表明问题出在哪里。它可能在处理插槽的代码中的某个地方。你应该试着调试这些插槽,看看你的所有标签是否都触发了它们。它们不是。我想这是因为我在这里声明了每个变量(上面的代码),所以它在压碎旧的变量。是的,这就是我想要的。。。你认为我应该像这样把标签列表放在地图上吗
std::map
打开新选项卡时,必须检查是否尚未打开同名选项卡。但是,如果我这样做,我就不会有迭代器了:(当您只需在QTabWidget.count()上执行
for循环
并使用
QTabWidget.tabText(i)检查名称时,创建映射似乎完全没有必要)
是的,我就是这么想的……你认为我应该像这样在地图中保留我的标签列表吗?
std::map
当我打开一个新标签时,我必须检查一个同名标签是否还没有打开。但是,如果我这样做,我就不会有迭代器:(如果只需在QTabWidget.count()上执行
for循环
,并使用
QTabWidget.tabText(i)