vs2017 搭建qt中的父子窗口,显示,并在父窗口的类中调用子窗口控件

添加构造子窗口

在vs中新建qt项目后,默认会创建主窗口的ui文件、头文件和cpp文件。在需要添加子窗口时,需要创建另外的ui文件、头文件、cpp文件,如下图:

子窗口类型变量作为父窗口的一个成员变量,在父窗口构造时自动构造子窗口,例如:

public:
	draw_setting setting_window;

c++中会先初始化类的成员变量,然后才会执行类的构造函数。所以在父窗口的构造函数中,可以对子窗口进行初始化操作,比如设置父窗口为子窗口的parent、初始化子窗口的位置、隐藏子窗口,代码示例(在父窗口构造函数中):

setting_window.setParent(this);
QPoint globalPos = this->mapToGlobal(QPoint(0, 0));//父窗口绝对坐标
int x = globalPos.x() + (this->width() - setting_window.width() - 100) / 2;//x坐标
int y = globalPos.y() + (this->height() - setting_window.height() - 100) / 2;//y坐标
setting_window.move(x, y);//窗口移动
setting_window.hide();

正常显示

虽然可以显示了,但是可能会因为继承了父窗口的无边框、透明背景等属性而显示的非常诡异,解决办法是重写子窗口的绘制事件:

子窗口头文件(.h文件):

protected:
	virtual void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

重写绘制事件函数体举例(.cpp文件):

void draw_setting::paintEvent(QPaintEvent *event)
{
	//绘制背景色,如果不会绘制则会继承父窗口的透明背景
	QPainter p(this);
	p.fillRect(rect(), QColor(240, 240, 240, 180));

	//绘制圆角
	QPainterPath path;
	path.setFillRule(Qt::WindingFill);
	QRectF rect(5, 5, this->width() - 10, this->height() - 10);
	path.addRoundRect(rect, 2, 2);

	//绘制阴影
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing, true);
	painter.fillPath(path, QBrush(Qt::white));

	QColor color(0, 0, 0, 50);
	for (int i = 0; i < 5; i++) {
		QPainterPath path;
		path.setFillRule(Qt::WindingFill);
		path.addRect(5 - i, 5 - i, this->width() - (5 - i) * 2, this->height() - (5 - i) * 2);
		color.setAlpha(150 - qSqrt(i+5) * 50);
		painter.setPen(color);
		painter.drawPath(path);
	}
}

控件访问

之后应该可以正常显示,但是在主窗口的cpp文件中调用不了子窗口的控件动作和属性,需要在主窗口的头文件中添加子窗口ui文件生成的头文件,例如:

#include "ui_draw_setting.h"

便通过创建的子窗口对象的ui属性正常访问子窗口的控件了

隐藏与显示控制

显示可以通过按钮的槽函数调用show函数实现,隐藏虽然也可以这样做,对于无边框的子窗口也可以检测鼠标在子窗口外面点击时隐藏子窗口,在父窗口的鼠标点击事件中检测状态,参考示例:

if (event->button() == Qt::LeftButton)
	{
        // 检测子窗口是否显示,如果显示并且点击位置在子窗口外面则隐藏子窗口
		if (!setting_window.geometry().contains(this->mapFromGlobal(QCursor::pos())) && !setting_window.isHidden())
		{
			setting_window.hide();
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值