[Qt]窗口大小、位置及其大小改变引起的事件QResizeEvent

本文介绍如何在Qt中使界面控件随窗口大小变化而自动调整,通过重写resizeEvent函数并使用不同方法获取窗口大小,实现MatlabCommandWindow控件与窗口的同步缩放。探讨了frameGeometry(), geometry()及控件自身大小获取方式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:https://blog.csdn.net/humanking7/article/details/86108269


Qt窗口大小、位置及其大小改变引起的事件QResizeEvent

1.使得Qt界面的控件随窗口的变化而变化

1.1. 目的

要将Matlab Command Window嵌入到一个QDialog中,使得这个窗口控件随着窗口大小的改变而改变。这就要重写resizeEvent(QResizeEvent *event)函数。

首先我设置了一个QLabel,设置这个QLabal的布局(不管是水平布局、垂直布局或是栅格布局都OK,因为只有这一个控件),目的是让这个QLabel铺满整个客户区Client Area(为了简单的获取客户区的大小

窗口设置

希望效果

拖动改变

1.2. 代码

//h文件
private:
	QWidget* m_Local_MatCmdWind = nullptr;//本程序的 Matlab Cmd窗口
protected:
	//将matlab窗口设置为随着窗口变化而变化
	virtual void resizeEvent(QResizeEvent *event) override;
	

//cpp文件
void MatlabCmdDlg::resizeEvent(QResizeEvent *event)
{
	if (nullptr != m_Local_MatCmdWind)
	{
		//不能显示滚动条
		//m_Local_MatCmdWind->resize(frameGeometry().size());
		
        //可以显示出滚动条,但是效果不是很好	
        //m_Local_MatCmdWind->resize(geometry().size());
        
		//可以显示出滚动条,显示效果也很好
		m_Local_MatCmdWind->resize(ui.lab_central->size());
	}	
}

其中:

  • m_Local_MatCmdWind就是要随着窗口变化而变化的一个QWidget窗体指针;
  • ui.lab_central就是中央的那个随窗口变化而变化的QLabel控件。

注意:

其中获取窗口大小有3种方式

  1. frameGeometry().size():窗口会显示不全,滚动条显示不了;
  2. geometry().size():滚动条显示一半,显示的不好;
  3. ui.lab_central->size():显示效果最佳。

那么问题来了,需要对Qt窗口有个大致的了解。

2. Qt窗口大小和位置

QT窗口说明

相关函数解释
frameGeometry()几何尺寸**(位置+大小)**对于窗口,包含窗口装饰器
x()、y()、pos()只包含位置信息(左上角坐标)对于窗口,包含窗口装饰器
move()只移动位置对于窗口,包含窗口装饰器
geometry()几何尺寸**(位置+大小)**不包含窗口装饰器
width()、height()、rect()、size()只包含大小信息不包含窗口装饰器
setGeometry()改变位置和大小不包含窗口装饰器
resize()只改变大小不包含窗口装饰器

另外3个有用的函数:

//设备相关的屏幕尺寸信息
QDesktopWidget* desktopWidget = QApplication::desktop();
//得到客户区矩形
QRect clientRect = desktopWidget->availableGeometry();
//得到应用程序矩形
QRect applicationRect = desktopWidget->screenGeometry();


//关于 QDesktopWidget
//Properties
    primaryScreen : const int
    screenCount : const int
    virtualDesktop : const bool

//Public Functions
    const QRect	availableGeometry(int screen = -1) const
    const QRect	availableGeometry(const QWidget * widget) const
    const QRect	availableGeometry(const QPoint & p) const
    bool	isVirtualDesktop() const
    int	primaryScreen() const
    QWidget *	screen(int screen = -1)
    int	screenCount() const
    const QRect	screenGeometry(int screen = -1) const
    const QRect	screenGeometry(const QWidget * widget) const
    const QRect	screenGeometry(const QPoint & p) const
    int	screenNumber(const QWidget * widget = 0) const
    int	screenNumber(const QPoint & point) const

//Signals
    void	resized(int screen)
    void	screenCountChanged(int newCount)
    void	workAreaResized(int screen)

赞赏码New

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值