QT中如何实现子窗口唯一?

jinggangshi 2013-06-07 08:26:56
主窗口中有个设置按钮,点击创建设置窗口。
问题是点击一次就创建一个,
怎样保证窗口唯一?
...全文
828 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
davidsu33 2013-06-19
  • 打赏
  • 举报
回复
7楼的做法,如果对Widget设置了自动释放,那么Widget对象是会自动被析构的,那么你下次取用widget的时候,指针会被悬空的,而我所采用的方法会自动对指针进行监视,不会出现指针被释放掉,但是指针并不为空的现象。
jinggangshi 2013-06-08
  • 打赏
  • 举报
回复
谢谢大家的回复,电脑重装中,一会测试。 davidsu33, 能否详细说下你的方法,QPointer<QWidget>和7楼的bool值判断有何不同?
  • 打赏
  • 举报
回复
单例模式??
jinggangshi 2013-06-08
  • 打赏
  • 举报
回复
引用 12 楼 davidsu33 的回复:
告诉你一个最简单的办法,这种问题我解决过,使用QPointer<QWidget> 做一个成员变量,就行了,判断成员变量isNull(),是空就被释放了,否则指针还未析构!
能再说详细点嘛?谢谢!
davidsu33 2013-06-08
  • 打赏
  • 举报
回复
告诉你一个最简单的办法,这种问题我解决过,使用QPointer<QWidget> 做一个成员变量,就行了,判断成员变量isNull(),是空就被释放了,否则指针还未析构!
_Gx 2013-06-08
  • 打赏
  • 举报
回复
引用 10 楼 jinggangshi 的回复:
主窗口->children() 我想要这个判断是否创建的代码。 我自己写了个测试的,结果每次都重新打开窗口。

	t *ttt;
	QObjectList qol = this->children();
	bool hasc = false;
	qDebug() << qol.count();
	for (int i = 0; i < qol.count(); i++) {
		QObject *o = qol[i];
		QString name = o->objectName();

		qDebug() << name;
		if (name == "ttt") {
			hasc = true;
			break;
		}

	}
	if (!hasc) {
		ttt = new t();
	}
	ui.label->setNum(qol.count());
	ttt->show();
从qol.count()看,children()不包含新创建的“ttt”
ttt = new t(this);
jinggangshi 2013-06-08
  • 打赏
  • 举报
回复
主窗口->children() 我想要这个判断是否创建的代码。 我自己写了个测试的,结果每次都重新打开窗口。

	t *ttt;
	QObjectList qol = this->children();
	bool hasc = false;
	qDebug() << qol.count();
	for (int i = 0; i < qol.count(); i++) {
		QObject *o = qol[i];
		QString name = o->objectName();

		qDebug() << name;
		if (name == "ttt") {
			hasc = true;
			break;
		}

	}
	if (!hasc) {
		ttt = new t();
	}
	ui.label->setNum(qol.count());
	ttt->show();
从qol.count()看,children()不包含新创建的“ttt”
_Gx 2013-06-08
  • 打赏
  • 举报
回复
引用 8 楼 jinggangshi 的回复:
[quote=引用 4 楼 q245879 的回复:] [quote=引用 2 楼 jinggangshi 的回复:] [quote=引用 1 楼 q245879 的回复:] 你的意思是创建了一个之后点击按钮就不要再创建新窗口了?
判断窗口是不已经创建,且没有被关闭,不重复创建已经创建且没有关闭的窗口。[/quote] 主窗口->children() 会返回它的孩子列表,可以从中去判断如果有你已经创建的子对象,那么就不要再创建了。 你的主窗口和子窗口要同时显示的吗?如果你创建子窗口的时候把父窗口隐藏了就不会出现 你说的重复创建的情况了。[/quote] 能否给段代码?谢谢![/quote] connect(button, SIGNAL(clicked()), this, SLOT(hide()));
超开心~ 2013-06-07
  • 打赏
  • 举报
回复
标记一下不就行了 if(isCreated) { widget->show(); } else { widget = new QWidget; widget->show(); isCreated = ture; } 销毁窗口的时候把isCreated改为false
jinggangshi 2013-06-07
  • 打赏
  • 举报
回复
引用 4 楼 q245879 的回复:
[quote=引用 2 楼 jinggangshi 的回复:] [quote=引用 1 楼 q245879 的回复:] 你的意思是创建了一个之后点击按钮就不要再创建新窗口了?
判断窗口是不已经创建,且没有被关闭,不重复创建已经创建且没有关闭的窗口。[/quote] 主窗口->children() 会返回它的孩子列表,可以从中去判断如果有你已经创建的子对象,那么就不要再创建了。 你的主窗口和子窗口要同时显示的吗?如果你创建子窗口的时候把父窗口隐藏了就不会出现 你说的重复创建的情况了。[/quote] 能否给段代码?谢谢!
jdwx 2013-06-07
  • 打赏
  • 举报
回复 1
子窗口用QDialog,exec()。模态的子窗口。
  • 打赏
  • 举报
回复
声明static
_Gx 2013-06-07
  • 打赏
  • 举报
回复
引用 2 楼 jinggangshi 的回复:
[quote=引用 1 楼 q245879 的回复:] 你的意思是创建了一个之后点击按钮就不要再创建新窗口了?
判断窗口是不已经创建,且没有被关闭,不重复创建已经创建且没有关闭的窗口。[/quote] 主窗口->children() 会返回它的孩子列表,可以从中去判断如果有你已经创建的子对象,那么就不要再创建了。 你的主窗口和子窗口要同时显示的吗?如果你创建子窗口的时候把父窗口隐藏了就不会出现 你说的重复创建的情况了。
dbzhang800 2013-06-07
  • 打赏
  • 举报
回复
引用 2 楼 jinggangshi 的回复:
[quote=引用 1 楼 q245879 的回复:] 你的意思是创建了一个之后点击按钮就不要再创建新窗口了?
判断窗口是不已经创建,且没有被关闭,不重复创建已经创建且没有关闭的窗口。[/quote] 这个你遇到什么特别的问题了么,该窗口指针不是你主窗口类的一个成员变量?
jinggangshi 2013-06-07
  • 打赏
  • 举报
回复
引用 1 楼 q245879 的回复:
你的意思是创建了一个之后点击按钮就不要再创建新窗口了?
判断窗口是不已经创建,且没有被关闭,不重复创建已经创建且没有关闭的窗口。
_Gx 2013-06-07
  • 打赏
  • 举报
回复
你的意思是创建了一个之后点击按钮就不要再创建新窗口了?

16,239

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧