原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接: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种方式
:
- 用
frameGeometry().size()
:窗口会显示不全,滚动条显示不了; - 用
geometry().size()
:滚动条显示一半,显示的不好; - 用
ui.lab_central->size()
:显示效果最佳。
那么问题来了,需要对Qt窗口
有个大致的了解。
2. 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)