1

在 Qt 中打开 QDialog 窗口,每次我单击某个项目时,我都会使用 new 进行操作,我想确保我只为每个我单击的项目打开一个 QDialog 实例:

void foo::treeWidget_itemClicked(QTreeWidgetItem *item,nt column)                                               
    .....
    QString groupID = item->data(0, Qt::UserRole).toString();
    QString groupName = item->text(0);
    GroupDialogContainer* pGroupDialogContainer = new GroupDialogContainer(groupID,                                                                               groupName,                                                                                   this);

    pGroupDialogContainer->show();

}

class GroupDialogContainer : public QDialog
{
    Q_OBJECT


public:
    GroupDialogContainer(QString GroupId,QString GroupName,QWidget *parent=0); 
    GroupDialogContainer(QWidget *parent=0);
    virtual ~GroupDialogContainer();
    Ui::GroupDialog ui;

public slots:
    void closeEvent(QCloseEvent *event);
};

我需要保留 GroupDialogContainer 的某种散列或向量吗?我的第二个问题也是:每次我用 close () 关闭 QDialog 窗口时,负责打开它的对象 pGroupDialogContainer 是破坏者吗?或者当我检测到 QDIalog 已关闭时是否需要删除它?

4

1 回答 1

1

是的,您可能应该保留某种对话框列表,以跟踪哪些对话框已经打开。如果您的 GroupID 是您的唯一 ID,那么您可以执行以下操作:

QMap 对话框图;

void foo::treeWidget_itemClicked(QTreeWidgetItem *item,nt column) {
..... QString groupID = item->data(0, Qt::UserRole).toString();

if (! DialogMap.contains(groupID))
{
  //  Popup the dialog and add it to map
  ...
  DialogMap.insert(groupID, pGroupDialogContainer);
}

}

现在,对于另一部分。最重要的是,当对话框关闭时,您需要从地图中删除该项目。然后您可以删除对话框,或者我的建议是让对话框在关闭时自行删除 - 如下所示:

 // set automatic deletion of object on close
 setAttribute(Qt::WA_DeleteOnClose);

但正如我所说,您仍然需要从地图中删除对话框,否则您将在其中有一个错误的指针,并且您的代码仍会认为对话框已打开。

因此,您需要来自对话框的某种信号来指示它正在关闭。有finished(int result) 信号,当你触发一个结果时被调用:

当用户或通过调用 done()、accept() 或 reject() 设置对话框的结果代码时,会发出此信号。

但是,您始终可以在对话框中创建自己的信号,并在对话框中调用 closeEvent 时发出它。

然后在处理地图的代码中......

connect( pGroupDialogContainer, SIGNAL(WindowClosed()), this, SLOT(vCleanUpTheMap()));
...
void vCleanUpTheMap()
{
   GroupDialogContainer *pDialog = dynamic_cast<GroupDialogContainer *>(sender());
   if (pDialog)
   {
      // Just to keep things clean disconnect from the dialog.
      disconnect(pDialog);

      //  I am assuming that you can get the key groupID from the dialog
      //  Cause it's a lot easier to remove from a map with the key
      DialogMap.remove(pDialog->GetGroupID());
   }
}

就是这样。

于 2011-06-02T21:29:17.693 回答