QT 自定义界面布局要诀

1. 问题:有三个UI 子界面在一个主界面UI 上组合,那么三个子界面需要从主界面传递QSize子区域大小吗?

如下:

MonitorWnd::MonitorWnd(QSzie size, QWidget* parent)

:ViewBaseWnd(parent){

setFixedSize(size);

}

实践所得:不需要设置大小,只需要设置伸缩比例即可 setStretchFactor

cpp 复制代码
void ViewWnd::InitUi()
{
	QVBoxLayout* view_layout = new QVBoxLayout(this);
	view_layout->setMargin(0);
	view_layout->setContentsMargins(QMargins(0, 0, 0, 0));
	view_layout->addSpacing(0);
	setLayout(view_layout);

	//view 标题栏
	m_title_wnd.reset(new ViewTitleWnd(this));
	m_title_wnd->setFixedHeight(VIEWTITLE_BUTTON_HEIGHT);

	view_layout->addWidget(m_title_wnd.get());
	//view_layout->addStretch();
	//view播放区域
	m_stacked_layout.reset(new QStackedLayout(view_layout));
	//QSize view_size(this->width(), this->height()- m_title_wnd->height());
	if (!m_monitor_wnd) {
		m_monitor_wnd.reset(new MonitorWnd(this));

		m_stacked_layout->addWidget(m_monitor_wnd.get());
		m_stacked_layout->setCurrentWidget(m_monitor_wnd.get());
		m_title_wnd->SetBtnStatusType(TitleTabType::TitleTabType_Monitor);//初始化显示监视器
		m_module_map[TitleTabType::TitleTabType_Monitor] = m_monitor_wnd;
	}
	if (!m_emap_wnd) {
		m_emap_wnd.reset(new EMapWnd(this));
		m_stacked_layout->addWidget(m_emap_wnd.get());
		m_module_map[TitleTabType::TitleTabType_EMap] = m_emap_wnd;
	}
	if (!m_terminal_wnd) {
		m_terminal_wnd.reset(new TerminalPreviewWnd(this));
		m_stacked_layout->addWidget(m_terminal_wnd.get());
		m_module_map[TitleTabType::TitleTabType_TerminalPreView] = m_terminal_wnd;
	}
	connect(m_title_wnd.get(), &ViewTitleWnd::sig_tabIndex, this, &ViewWnd::slot_TitleClicked);
}

以上 m_monitor_wnd 、m_emap_wnd、m_terminal_wnd为三个子界面的对象。

cpp 复制代码
void MonitorWnd::InitUi()
{
	QHBoxLayout* main_layout = new QHBoxLayout(this);
	main_layout->setMargin(0);
	main_layout->setContentsMargins(QMargins(0, 0, 0, 0));
	main_layout->setSpacing(0);

	QWidget* play_wnd = new QWidget(this);
	play_wnd->setObjectName("MonitorPlayWnd");

	QVBoxLayout* play_layout = new QVBoxLayout(play_wnd);
	play_layout->setMargin(0);
	play_layout->setContentsMargins(QMargins(0, 0, 0, 0));
	play_layout->setSpacing(0);

	play_wnd->setLayout(play_layout);
	//play_layout->addStretch();
	{
		m_monitor_name.reset( new QLabel(this));
		m_monitor_name->setFixedHeight(MONITOR_NAME_H);
		play_layout->addWidget(m_monitor_name.get(), 0, Qt::AlignVCenter);

		m_playpannel.reset(new PlayPannel(false, true, true, true, true, true, true, true, MAX_WND_VIDEO, this));
		//int height = this->height();
		//m_playpannel->setFixedHeight(this->height() - m_monitor_name->height() - MONITOR_CTROLAREA_H);

		QWidget* ctr_area = new QWidget(play_wnd);
		ctr_area->setObjectName("MonitorCtrArea");
		ctr_area->setFixedHeight(MONITOR_CTROLAREA_H);
		play_layout->addWidget(m_playpannel.get());
		play_layout->addWidget(ctr_area);
    }
    //右侧设备显示区
	//QWidget* list_monitors = new QWidget(this);
	//QSize monitorlist_size = QSize(this->width()/5, this->height());
	m_monitorlist_wnd.reset(new MonitorListWnd(this));

	main_layout->addWidget(play_wnd,4);
	main_layout->addWidget(m_monitorlist_wnd.get(), 1);
	this->setLayout(main_layout);
}

//play_layout->addStretch();这个是空白间隔符,不要随意添加,显示异常还难以排查。

总结: 使用QHBoxLayout QVBoxLayout 然后 addWidget, 有时候会用到addSpacing(), addStrech(),但是要谨慎;**添加子界面不需要设置固定大小setFixSize(.....),**只需要在添加到Layout时设置伸缩比例即可:

main_layout->addWidget(play_wnd,4);

main_layout->addWidget(m_monitorlist_wnd.get(), 1);

相关推荐
強云33 分钟前
界面架构- MVP(Qt)
qt·架构
我命由我1234537 分钟前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
徐小黑ACG2 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
0白露3 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.4 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐4 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
Tttian6225 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
独好紫罗兰6 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
闪电麦坤957 小时前
C#:base 关键字
开发语言·c#
Mason Lin7 小时前
2025年3月29日(matlab -ss -lti)
开发语言·matlab