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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/humanking7/article/details/86108269


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

原文链接: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

猜你喜欢

转载自blog.csdn.net/humanking7/article/details/86108269