Qt 窗口部件适应窗口大小变化

合集下载

VB中控件大小随窗体大小变化而变化

VB中控件大小随窗体大小变化而变化

VB中控件大小随窗体大小变化而变化有时窗体变化后,如改变分辨率后控件大小却不能随之改变。

手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。

在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:Private Sub Form_Resize()Dim H, i As IntegerOn Error Resume NextResize_ALL Me 'Me是窗体名,Form1,Form2等等都可以End Sub在模块中添加以下代码:Public Type ctrObjName As StringIndex As LongParrent As StringTop As LongLeft As LongHeight As LongWidth As LongScaleHeight As LongScaleWidth As LongEnd TypePrivate FormRecord() As ctrObjPrivate ControlRecord() As ctrObjPrivate bRunning As BooleanPrivate MaxForm As LongPrivate MaxControl As LongPrivate Const WM_NCLBUTTONDOWN = &HA1Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Declare Function ReleaseCapture Lib "USER32" () As Long Function ActualPos(plLeft As Long) As LongIf plLeft < 0 ThenActualPos = plLeft + 75000ElseActualPos = plLeftEnd IfEnd FunctionFunction FindForm(pfrmIn As Form) As LongDim i As LongFindForm = -1If MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenFindForm = iExit FunctionEnd IfNext iEnd IfEnd FunctionFunction AddForm(pfrmIn As Form) As LongDim FormControl As ControlDim i As LongReDim Preserve FormRecord(MaxForm + 1)FormRecord(MaxForm).Name = FormRecord(MaxForm).Top = pfrmIn.TopFormRecord(MaxForm).Left = pfrmIn.LeftFormRecord(MaxForm).Height = pfrmIn.Height FormRecord(MaxForm).Width = pfrmIn.Width FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth AddForm = MaxFormMaxForm = MaxForm + 1For Each FormControl In pfrmIni = FindControl(FormControl, )If i < 0 Theni = AddControl(FormControl, )End IfNext FormControlEnd FunctionFunction FindControl(inControl As Control, inName As String) As LongDim i As LongFindControl = -1For i = 0 To (MaxControl - 1)If ControlRecord(i).Parrent = inName ThenIf ControlRecord(i).Name = ThenOn Error Resume NextIf ControlRecord(i).Index = inControl.Index ThenFindControl = iExit FunctionEnd IfOn Error GoTo 0End IfEnd IfNext iEnd FunctionFunction AddControl(inControl As Control, inName As String) As LongReDim Preserve ControlRecord(MaxControl + 1)On Error Resume NextControlRecord(MaxControl).Name = ControlRecord(MaxControl).Index = inControl.IndexControlRecord(MaxControl).Parrent = inNameIf TypeOf inControl Is Line ThenControlRecord(MaxControl).Top = inControl.Y1ControlRecord(MaxControl).Left = ActualPos(inControl.X1)ControlRecord(MaxControl).Height = inControl.Y2ControlRecord(MaxControl).Width = ActualPos(inControl.X2)ElseControlRecord(MaxControl).Top = inControl.TopControlRecord(MaxControl).Left = ActualPos(inControl.Left)ControlRecord(MaxControl).Height = inControl.HeightControlRecord(MaxControl).Width = inControl.WidthEnd IfinControl.IntegralHeight = FalseOn Error GoTo 0AddControl = MaxControlMaxControl = MaxControl + 1End FunctionFunction PerWidth(pfrmIn As Form) As LongDim i As Longi = FindForm(pfrmIn)If i < 0 Theni = AddForm(pfrmIn)End IfPerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth End FunctionFunction PerHeight(pfrmIn As Form) As DoubleDim i As Longi = FindForm(pfrmIn)If i < 0 Theni = AddForm(pfrmIn)End IfPerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight End FunctionPublic Sub ResizeControl(inControl As Control, pfrmIn As Form)On Error Resume NextDim i As LongDim widthfactor As Single, heightfactor As SingleDim minFactor As SingleDim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As LongyRatio = PerHeight(pfrmIn)xRatio = PerWidth(pfrmIn)i = FindControl(inControl, )If inControl.Left < 0 ThenlLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000) ElselLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)End IflTop = CLng((ControlRecord(i).Top * yRatio) \ 100)lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)If TypeOf inControl Is Line ThenIf inControl.X1 < 0 TheninControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)ElseinControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100) End IfinControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)If inControl.X2 < 0 TheninControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)ElseinControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100) End IfinControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100) ElseinControl.Move lLeft, lTop, lWidth, lHeightinControl.Move lLeft, lTop, lWidthinControl.Move lLeft, lTopEnd IfEnd SubPublic Sub ResizeForm(pfrmIn As Form)Dim FormControl As ControlDim isVisible As BooleanDim StartX, StartY, MaxX, MaxY As LongDim bNew As BooleanIf Not bRunning ThenbRunning = TrueIf FindForm(pfrmIn) < 0 ThenbNew = TrueElsebNew = FalseEnd IfIf pfrmIn.Top < 30000 ThenisVisible = pfrmIn.VisibleOn Error Resume NextIf Not pfrmIn.MDIChild ThenOn Error GoTo 0' ' pfrmIn.Visible = FalseElseIf bNew ThenStartY = pfrmIn.HeightStartX = pfrmIn.WidthOn Error Resume NextFor Each FormControl In pfrmInIf FormControl.Left + FormControl.Width + 200 > MaxX ThenMaxX = FormControl.Left + FormControl.Width + 200End IfIf FormControl.Top + FormControl.Height + 500 > MaxY ThenMaxY = FormControl.Top + FormControl.Height + 500End IfIf FormControl.X1 + 200 > MaxX ThenMaxX = FormControl.X1 + 200End IfIf FormControl.Y1 + 500 > MaxY ThenMaxY = FormControl.Y1 + 500End IfIf FormControl.X2 + 200 > MaxX ThenMaxX = FormControl.X2 + 200End IfIf FormControl.Y2 + 500 > MaxY ThenMaxY = FormControl.Y2 + 500End IfNext FormControlOn Error GoTo 0pfrmIn.Height = MaxYpfrmIn.Width = MaxXEnd IfOn Error GoTo 0End IfFor Each FormControl In pfrmInResizeControl FormControl, pfrmIn Next FormControlOn Error Resume NextIf Not pfrmIn.MDIChild ThenOn Error GoTo 0pfrmIn.Visible = isVisibleElseIf bNew ThenpfrmIn.Height = StartYpfrmIn.Width = StartXFor Each FormControl In pfrmInResizeControl FormControl, pfrmIn Next FormControlEnd IfEnd IfOn Error GoTo 0End IfbRunning = FalseEnd IfEnd SubPublic Sub SaveFormPosition(pfrmIn As Form)Dim i As LongIf MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenFormRecord(i).Top = pfrmIn.TopFormRecord(i).Left = pfrmIn.LeftFormRecord(i).Height = pfrmIn.HeightFormRecord(i).Width = pfrmIn.WidthExit SubEnd IfNext iAddForm (pfrmIn)End IfEnd SubPublic Sub RestoreFormPosition(pfrmIn As Form)Dim i As LongIf MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenIf FormRecord(i).Top < 0 ThenpfrmIn.WindowState = 2ElseIf FormRecord(i).Top < 30000 ThenpfrmIn.WindowState = 0pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).HeightElsepfrmIn.WindowState = 1End IfExit SubEnd IfNext iEnd IfEnd SubPublic Sub Resize_ALL(Form_Name As Form)Dim OBJ As ObjectFor Each OBJ In Form_NameResizeControl OBJ, Form_NameNext OBJEnd SubPublic Sub DragForm(frm As Form)On Local Error Resume NextCall ReleaseCaptureCall SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0) End Sub。

cssqt控件统一大小

cssqt控件统一大小

cssqt控件统一大小(实用版)目录1.CSS 中的盒模型2.控制控件大小的方法3.使用 CSS 设置控件统一大小4.实际应用案例正文一、CSS 中的盒模型在 CSS 中,一个控件的大小通常由盒模型决定。

盒模型包括内容(content)、内边距(padding)、边框(border)和外边距(margin)四个部分。

这四个部分共同决定了一个控件在页面上的实际大小。

二、控制控件大小的方法要控制控件的大小,可以通过修改盒模型的各个部分来实现。

以下是常用的几种方法:1.使用 width 和 height 属性:分别设置控件的宽度和高度。

2.使用 css 的 box-sizing 属性:设置盒模型的计算方式,如border-box 或 content-box。

3.使用内边距(padding):通过设置控件的内边距,来调整控件的实际大小。

4.使用边框(border):设置控件的边框宽度,从而影响控件的实际大小。

5.使用外边距(margin):设置控件的外边距,来调整控件与其他控件之间的间距。

三、使用 CSS 设置控件统一大小在实际开发中,为了保持界面的美观和统一,常常需要设置控件的统一大小。

以下是一个简单的示例:```css.control {width: 200px;height: 50px;margin: 10px;padding: 10px;border: 1px solid #ccc;}```在上述代码中,我们通过设置宽度、高度、内边距、边框和外边距,来统一控制控件的大小。

qt setlayout的用法 -回复

qt setlayout的用法 -回复

qt setlayout的用法-回复标题:Qt SetLayout的用法详解在Qt框架中,布局(Layout)是一种非常重要的机制,它负责控制用户界面中的部件(Widget)的位置和大小。

SetLayout函数是用于设置部件容器(Widget Container)的布局的一种方法。

本文将详细介绍如何使用SetLayout函数来实现布局的设置。

一、基本概念1. 布局(Layout):布局是一个容器,它可以包含多个部件,并决定这些部件在窗口中的位置和大小。

布局可以自动调整其包含的部件以适应窗口大小的变化。

2. 部件容器(Widget Container):部件容器是一个特殊的部件,它可以包含其他部件。

通常情况下,我们会在部件容器上设置布局,然后将其他部件添加到这个布局中。

3. SetLayout函数:SetLayout函数是用来设置部件容器的布局的函数。

它的原型为void QWidget::setLayout(QLayout *layout)。

二、创建布局在Qt中,我们可以使用QHBoxLayout、QVBoxLayout、QGridLayout 等类来创建布局。

例如,我们可以这样创建一个水平布局:cppQHBoxLayout *layout = new QHBoxLayout;三、添加部件到布局创建好布局后,我们可以使用addWiget()函数将部件添加到布局中。

例如,我们可以这样将两个按钮添加到上述的布局中:cppQPushButton *button1 = new QPushButton("Button 1"); QPushButton *button2 = new QPushButton("Button 2");layout->addWidget(button1);layout->addWidget(button2);四、设置布局创建好布局并添加好部件后,我们就可以使用setLayout()函数将布局设置到部件容器上了。

如何获得Qt窗口部件在主窗口中的位置

如何获得Qt窗口部件在主窗口中的位置

如何获得Qt窗⼝部件在主窗⼝中的位置⽤Qt Creator 设计程序时,最⽅便的就是ui设计器,可以很容易的得到想要的布局。

但是这样⾃动布局带来的后果是很难知道窗⼝中某⼀部件在主窗⼝中的相对位置。

在处理⼦窗⼝⿏标事件时变的很⿇烦。

主窗⼝有菜单、⼯具条等,想⽤⿏标绘图,
把⿏标轨迹映射到窗⼝部件上,这些问题。

其实最主要的是获得窗⼝部件的起始点相对主窗⼝的位置。

例如:在主窗⼝拖⼊⼀个QScrollArea 在其上放⼀个QLabel⽤来显⽰⿏标事件。

可以在ui对象结构上看到如下结构。

⼤家知道,我们可以⽤pos()来获得某⼀窗⼝部件的起始点相对其⽗的位置。

那么,看结构可知,要获得scrollArea_2在主窗⼝(MainWindow)中的相对位置
即为:ui->scrollArea_2->pos()+ui->centralWidget->pos()
所以想获得窗⼝ScrollArea_2在主窗⼝中的相对位置区域为:
labelrect = QRect(ui->scrollArea_2->pos()+ui->centralWidget->pos(),
ui->scrollArea_2->size());
那么判断⿏标是否在此控件上只需在⿏标事件响应函数内写如下语句即可:
if(labelrect.contains(event->pos())) {……}
现在你可以在任意复杂的ui结构中确定某⼀⼦部件的位置了,但⼀定要注意:
⽗关系,即当前部件于其⽗部件的相对位置,其⽗部件与上层部件的相对位置,
直到与主窗⼝的相对位置。

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。

网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。

Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。

我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。

要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

这部分具体的参数解释摘录如下:结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。

Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。

一个QSizePolicy的所有变量对水平方向和垂直方向都适用。

下面列举了一些最长用的值:A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。

控件不能小于这个sizeHint,但是可以放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小E. Expandint:控件可以自行增大或者缩小注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)所以对于需要根据窗口大小对应改变的部件我这里就设置为Expandint。

QtCreator快速入门经典

QtCreator快速入门经典

2.然后新建一个 Qt Designer Form Class 类,类名为 loginDlg,选用 Dialog without Buttons,将其加入上面的工程中。文件列表如下:
3.在 logindlg.ui 中设计下面的界面:行输入框为 Line Edit。其中用户名后面 的输入框在属性中设置其 object Name 为 usrLineEdit,密码后面的输入框为 pwdLineEdit,登录按钮为 loginBtn,退出按钮为 exitBtn。
Widget w;
if(my1.exec()==QDialog::Accepted) {
w.show(); } return a.exec();
}
这样虽然解决了上面主窗口一闪而过的问题,但是,如果在 my1 对话框出现的时 候不点 enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样的吗?如果你此时对程序进行了改动,再次按下 run 按钮,你会发 现又出现了 error: collect2: ld returned 1 exit status 的错误,这说明程 序并没有结束,我们可以打开 windows 任务管理器,可以看到我们的程序仍在执 行。
种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关
联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是
一样的。
这个程序里我们实现了两类窗口打开的方式,一个是自身消失而
后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的
方法是不同的。
三、Qt Creator 登录对话框(原创)
#ifndef WIDGET_H
#define WIDGET_H

QDialog可移动可变化大小及背景设置

QDialog可移动可变化大小及背景设置

添加定义#definePADDING2enum Direction{UP=0,DOWN=1,LEFT,RIGHT,LEFTTOP,LEFTBOTTOM,RIGHTBOTTOM,R IGHTTOP,NONE};1、在头文件中类添加函数和变量void mouseReleaseEvent(QMouseEvent*event);void mouseMoveEvent(QMouseEvent*event);void mousePressEvent(QMouseEvent*event);void region(const QPoint&cursorGlobalPoint);//鼠标全局位置bool isLeftPressDown;//判断左键是否按下QPoint dragPosition;//窗口移动拖动时需要记住的点Direction dir;//窗口大小改变时,记录改变方向2、在main函数中添加this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowSystemMenuHint ); //隐藏Dialog标题栏this->setStyleSheet("QDialog{background-color:#FFFFFF}""QDialog{border:2pxgroovegray;border-radius:10px;padding:2px4px}");//设置Dialog背景为白色,边框为圆角this->setMinimumHeight(480);this->setMinimumWidth(1250);isLeftPressDown=false;this->dir=NONE;this->setMouseTracking(true);//追踪鼠标3、实现方法void QDataTableDlg::region(const QPoint&cursorGlobalPoint){QRect rect=this->rect();QPoint tl=mapToGlobal(rect.topLeft());QPoint rb=mapToGlobal(rect.bottomRight());int x=cursorGlobalPoint.x();int y=cursorGlobalPoint.y();if(tl.x()+PADDING>=x&&tl.x()<=x&&tl.y()+PADDING>=y&&tl.y()<=y){//左上角dir=LEFTTOP;this->setCursor(QCursor(Qt::SizeFDiagCursor));//设置鼠标形状}elseif(x>=rb.x()-PADDING&&x<=rb.x()&&y>=rb.y()-PADDING&&y<=rb.y()){ //右下角dir=RIGHTBOTTOM;this->setCursor(QCursor(Qt::SizeFDiagCursor));}elseif(x<=tl.x()+PADDING&&x>=tl.x()&&y>=rb.y()-PADDING&&y<=rb.y()){ //左下角dir=LEFTBOTTOM;this->setCursor(QCursor(Qt::SizeBDiagCursor));}elseif(x<=rb.x()&&x>=rb.x()-PADDING&&y>=tl.y()&&y<=tl.y()+PADDING){ //右上角dir=RIGHTTOP;this->setCursor(QCursor(Qt::SizeBDiagCursor));}elseif(x<=tl.x()+PADDING&&x>=tl.x()){//左边dir=LEFT;this->setCursor(QCursor(Qt::SizeHorCursor));}elseif(x<=rb.x()&&x>=rb.x()-PADDING){//右边dir=RIGHT;this->setCursor(QCursor(Qt::SizeHorCursor));}elseif(y>=tl.y()&&y<=tl.y()+PADDING){//上边dir=UP;this->setCursor(QCursor(Qt::SizeVerCursor));}elseif(y<=rb.y()&&y>=rb.y()-PADDING){//下边dir=DOWN;this->setCursor(QCursor(Qt::SizeVerCursor));}else{//默认dir=NONE;this->setCursor(QCursor(Qt::ArrowCursor));}}void QDataTableDlg::mouseReleaseEvent(QMouseEvent*event){if(event->button()==Qt::LeftButton){isLeftPressDown=false;if(dir!=NONE){this->releaseMouse();this->setCursor(QCursor(Qt::ArrowCursor));}}}void QDataTableDlg::mousePressEvent(QMouseEvent*event){switch(event->button()){case Qt::LeftButton:isLeftPressDown=true;if(dir!=NONE){this->mouseGrabber();}else{dragPosition=event->globalPos()-this->frameGeometry().topLeft(); }break;case Qt::RightButton://this->close();break;default:QDialog::mousePressEvent(event);}}void QDataTableDlg::mouseMoveEvent(QMouseEvent*event){QPoint gloPoint=event->globalPos();QRect rect=this->rect();QPoint tl=mapToGlobal(rect.topLeft());QPoint rb=mapToGlobal(rect.bottomRight());if(!isLeftPressDown){this->region(gloPoint);}else{if(dir!=NONE){QRect rMove(tl,rb);switch(dir){case LEFT:if(rb.x()-gloPoint.x()<=this->minimumWidth())rMove.setX(tl.x());elserMove.setX(gloPoint.x());break;case RIGHT:rMove.setWidth(gloPoint.x()-tl.x());break;case UP:if(rb.y()-gloPoint.y()<=this->minimumHeight())rMove.setY(tl.y());elserMove.setY(gloPoint.y());break;case DOWN:rMove.setHeight(gloPoint.y()-tl.y());break;case LEFTTOP:if(rb.x()-gloPoint.x()<=this->minimumWidth()) rMove.setX(tl.x());elserMove.setX(gloPoint.x());if(rb.y()-gloPoint.y()<=this->minimumHeight()) rMove.setY(tl.y());elserMove.setY(gloPoint.y());break;case RIGHTTOP:rMove.setWidth(gloPoint.x()-tl.x());rMove.setY(gloPoint.y());break;case LEFTBOTTOM:rMove.setX(gloPoint.x());rMove.setHeight(gloPoint.y()-tl.y());break;case RIGHTBOTTOM:rMove.setWidth(gloPoint.x()-tl.x());rMove.setHeight(gloPoint.y()-tl.y());break;default:break;}this->setGeometry(rMove);}else{move(event->globalPos()-dragPosition);event->accept();}}QDialog::mouseMoveEvent(event);}。

qt的setwidgetfixedsize函数机制

qt的setwidgetfixedsize函数机制

Qt的setWidgetFixedSize函数机制1. 概述Qt是一款跨评台的C++应用程序开发框架,提供了丰富的工具和库,方便开发者进行图形用户界面(GUI)程序的开发。

在Qt中,setWidgetFixedSize函数是常用的函数之一,用于设置窗口部件的固定大小。

本文将探讨setWidgetFixedSize函数的机制及其使用方法。

2. setWidgetFixedSize函数的作用setWidgetFixedSize函数用于设置窗口部件(Widget)的固定大小,即禁止用户通过拖拽窗口大小的方式改变窗口部件的大小。

这在一些需求下是非常重要的,比如当窗口部件的布局已经经过精心设计,不希望用户随意改变窗口大小时,就可以使用setWidgetFixedSize函数来锁定窗口部件的大小。

3. setWidgetFixedSize函数的参数setWidgetFixedSize函数的参数为窗口部件的宽度和高度,如下所示:```cppvoid QWidget::setFixedSize(int w, int h)```其中,w为窗口部件的宽度,h为窗口部件的高度。

4. setWidgetFixedSize函数的调用setWidgetFixedSize函数通常在窗口部件的构造函数或初始化函数中进行调用,代码示例如下:```cppQM本人nWindow *m本人nWindow = new QM本人nWindow; m本人nWindow->setFixedSize(800, 600);```以上代码中,创建了一个主窗口部件m本人nWindow,并设置其固定大小为800x600像素。

5. setWidgetFixedSize函数的机制setWidgetFixedSize函数的机制是通过设置窗口部件的最小和最大大小来实现的。

一旦调用了setWidgetFixedSize函数,窗口部件的最小和最大大小都会被设置为函数参数指定的大小,即窗口部件无法再通过用户拖拽改变大小。

QtDesigner修改窗体大小改变控件位置

QtDesigner修改窗体大小改变控件位置

QtDesigner修改窗体⼤⼩改变控件位置⼀.新建⼀个窗体⽤qt designer 新建⼀个QWidget窗体,在窗体中右键选择布局,发现布局是选择不了的,这个是因为窗体⾥⾯没有添加控件,任意添加空间后便可选择右键-- 布局-- ⽔平布局/垂直布局等⼆. 添加控件我们添加⼀个group box 控件,然后右键选择布局 -- 垂直布局在添加⼀个horizontalLayout,再给horizontalLayout⾥⾯添加两个button按钮向group box ⾥⾯添加⼀个label 和 botton然后在group box 的⾥⾯选择右键 -- 布局 -- ⽔平布局三. 添加spacers效果我们给group box ⾥⾯的两个控件直接添加⼀个horizontalSpacer给group box 和horizontalLayout 直接添加⼀个verticalSpacer在这⾥说明下spacers 缩放类型 sizeTypeExpanding :可⾃⾏增⼤和收缩Fixed:不能放⼤或缩⼩Minimum:不能⼩于sizeHint尺⼨,可放⼤(若设置了最⼤尺⼨)Maximum:不能放⼤,可缩⼩到允许的最⼩尺⼨(若setMinimumSize(10,10)只能缩⼩到(10,10))Preferred:控件的sizeHint是他的Hint,可以放⼤或缩⼩四. ⽣成ui与pyspacersLayouts.ui⽂件:1<?xml version="1.0" encoding="UTF-8"?>2<ui version="4.0">3<class>Form</class>4<widget class="QWidget" name="Form">5<property name="geometry">6<rect>7<x>0</x>8<y>0</y>9<width>518</width>10<height>429</height>11</rect>12</property>13<property name="windowTitle">14<string>Form</string>15</property>16<layout class="QVBoxLayout" name="verticalLayout">17<item>18<widget class="QGroupBox" name="groupBox">19<property name="minimumSize">20<size>21<width>0</width>22<height>100</height>23</size>24</property>25<property name="maximumSize">26<size>27<width>16777215</width>28<height>200</height>29</size>30</property>31<property name="title">32<string>分组</string>33</property>34<layout class="QHBoxLayout" name="horizontalLayout"> 35<item>36<widget class="QLabel" name="label">37<property name="text">38<string>左侧</string>39</property>40</widget>41</item>42<item>43<spacer name="horizontalSpacer_2">44<property name="orientation">45<enum>Qt::Horizontal</enum>46</property>47<property name="sizeHint" stdset="0">48<size>49<width>40</width>50<height>20</height>51</size>52</property>53</spacer>54</item>55<item>56<widget class="QPushButton" name="pushButton_2"> 57<property name="text">58<string>右侧</string>59</property>60</widget>61</item>62</layout>63</widget>64</item>65<item>66<spacer name="verticalSpacer">67<property name="orientation">68<enum>Qt::Vertical</enum>69</property>70<property name="sizeType">71<enum>QSizePolicy::Expanding</enum>72</property>73<property name="sizeHint" stdset="0">74<size>75<width>20</width>76<height>100</height>77</size>78</property>79</spacer>80</item>81<item>82<layout class="QHBoxLayout" name="horizontalLayout_2"> 83<property name="spacing">84<number>6</number>85</property>86<item>87<spacer name="horizontalSpacer">88<property name="orientation">89<enum>Qt::Horizontal</enum>90</property>91<property name="sizeHint" stdset="0">92<size>93<width>40</width>94<height>20</height>95</size>96</property>97</spacer>98</item>99<item>100<widget class="QPushButton" name="pushButton_3"> 101<property name="text">102<string>确定</string>103</property>104</widget>105</item>106<item>107<widget class="QPushButton" name="pushButton_4"> 108<property name="text">109<string>取消</string>110</property>111</widget>112</item>113</layout>114</item>115</layout>116</widget>117<resources/>118<connections/>119</ui>⽣成的spacersLayouts.py ⽂件1# -*- coding: utf-8 -*-23# Form implementation generated from reading ui file 'spacersLayouts.ui'4#5# Created: Tue Mar 03 15:44:16 20156# by: PyQt4 UI code generator 4.10.37#8# WARNING! All changes made in this file will be lost!910from PyQt4 import QtCore, QtGui1112try:13 _fromUtf8 = QtCore.QString.fromUtf814except AttributeError:15def _fromUtf8(s):16return s1718try:19 _encoding = QtGui.QApplication.UnicodeUTF820def _translate(context, text, disambig):21return QtGui.QApplication.translate(context, text, disambig, _encoding)22except AttributeError:23def _translate(context, text, disambig):24return QtGui.QApplication.translate(context, text, disambig)2526class Ui_Form(object):27def setupUi(self, Form):28 Form.setObjectName(_fromUtf8("Form"))29 Form.resize(518, 429)30 self.verticalLayout = QtGui.QVBoxLayout(Form)31 self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))32 self.groupBox = QtGui.QGroupBox(Form)33 self.groupBox.setMinimumSize(QtCore.QSize(0, 100))34 self.groupBox.setMaximumSize(QtCore.QSize(16777215, 200))35 self.groupBox.setObjectName(_fromUtf8("groupBox"))36 self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox)37 self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))38 bel = QtGui.QLabel(self.groupBox)39 bel.setObjectName(_fromUtf8("label"))40 self.horizontalLayout.addWidget(bel)41 spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)42 self.horizontalLayout.addItem(spacerItem)43 self.pushButton_2 = QtGui.QPushButton(self.groupBox)44 self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))45 self.horizontalLayout.addWidget(self.pushButton_2)46 self.verticalLayout.addWidget(self.groupBox)47 spacerItem1 = QtGui.QSpacerItem(20, 100, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)48 self.verticalLayout.addItem(spacerItem1)49 self.horizontalLayout_2 = QtGui.QHBoxLayout()50 self.horizontalLayout_2.setSpacing(6)51 self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))52 spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)53 self.horizontalLayout_2.addItem(spacerItem2)54 self.pushButton_3 = QtGui.QPushButton(Form)55 self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))56 self.horizontalLayout_2.addWidget(self.pushButton_3)57 self.pushButton_4 = QtGui.QPushButton(Form)58 self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))59 self.horizontalLayout_2.addWidget(self.pushButton_4)60 self.verticalLayout.addLayout(self.horizontalLayout_2)6162 self.retranslateUi(Form)63 QtCore.QMetaObject.connectSlotsByName(Form)6465def retranslateUi(self, Form):66 Form.setWindowTitle(_translate("Form", "Form", None))67 self.groupBox.setTitle(_translate("Form", "分组", None))68 bel.setText(_translate("Form", "左侧", None))69 self.pushButton_2.setText(_translate("Form", "右侧", None))70 self.pushButton_3.setText(_translate("Form", "确定", None))71 self.pushButton_4.setText(_translate("Form", "取消", None)) 727374if__name__ == "__main__":75import sys76 app = QtGui.QApplication(sys.argv)77 Form = QtGui.QWidget()78 ui = Ui_Form()79 ui.setupUi(Form)80 Form.show()81 sys.exit(app.exec_())效果:。

Qt私活之实现伸缩滑动窗口

Qt私活之实现伸缩滑动窗口

Qt私活之实现伸缩滑动窗口最近接的几个私活,用户都要求实现能伸缩滑动的窗口,即窗口的中央有滑动条可以动态改变子窗口的大小;于是我觉得有必要把这部分整理并写出来,因为毕竟伸缩滑动窗口在实际环境中应用挺多的,同时许多流行的软件也使用这个功能。

最后实现出来的效果图如下:初始界面鼠标移到滑动条时出现按钮窗口滑动状态右边窗口最小化下面我大概讲解下如何实现这个功能。

一、创建Qt GUI应用程序这一步我就不详细说了,只要使用Qt Creator 一步一步创建即可;假如生成的主界面是MainFrame,那么我们所要做的就是在MainFrame文件中添加窗口滑动功能,使用QSplitter类,然后对主窗口增加布局即可。

二、增加子窗口QSplitter类划分水平左右两个窗口,同时需要添加一个按钮来对最右边的窗口显示和隐藏。

在构造函数里分别对这些部件进行初始化处理:m_pSplitter = new QSplitter(this);m_pSplitter->addWidget(m_pContentFrame);m_pSplitter->addWidget(m_pListFrame);m_pSplitter->handle(1)->installEventFilter(this);m_pSplitter->setHandleWidth(1);connect(m_pSplitter,SIGNAL(splitterMoved(int,int)),this,SLOT(slot_splitterMoved(int,int)));m_pButton = new QPushButton(this);m_pButton->setVisible(false);m_pButton->setFixedSize(13,42);m_pButton->setIconSize(QSize(13,42));m_pButton->setStyleSheet("border:none;");connect(m_pButton,SIGNAL(clicked()),this,SLOT(slot_bntClicked()));三、事件处理由于初始我们不知道各个窗口子部件的大小,所以覆盖showEvent事件进行初始处理:if(!m_bInitShow){setSizeSplitter(m_pSplitter->width()-180,180-m_pSplitter->handleWidth());setBtnPos();setBtnIcon();m_bInitShow = true;}QFrame::showEvent(event);在窗口大小发生变化时,也需要做些处理,所以覆盖resizeEvent进行位置处理:void QClockFrame::resizeEvent(QResizeEvent *event){setBtnPos();QFrame::resizeEvent(event);}最后还需要对事件进行过滤,即eventFilter函数,对按钮的显示隐藏进行判断。

Qt窗口的一些简单设置-标题、图标、最大化最小化按钮、任务栏图标

Qt窗口的一些简单设置-标题、图标、最大化最小化按钮、任务栏图标

Qt窗⼝的⼀些简单设置-标题、图标、最⼤化最⼩化按钮、任务栏图标零零碎碎看了很多Qt例⼦,有⼀些很零散的窗体控制⽅法,在这总结⼀些。

1.更改窗体标题this->setWindowTitle("窗体标题");窗体标题”就是更改的窗体标题2.控制窗体⼤⼩1this->setMaximumSize(300,300); //窗体最⼤尺⼨2this->setMinimumSize(300,300); //窗体最⼩尺⼨3this->setMinimumHeight(300); //单独设置窗体⾼的最⼩值4this->setMaximumWidth(300); //单独设置窗体宽的最⼩值也可以通过窗体布局控制窗体⼤⼩1 QGridLayout *mainLayout = new QGridLayout; //窗体中控件为⽹格布局2 mainLayout->setSizeConstraint(QLayout::SetFixedSize); //布局⼤⼩不变在构造函数中的这个函数强制设置窗体的布局为固定⼤⼩,⽤户不可⾃⾏调整对话框⼤⼩。

布局管理器将会负责调整⼤⼩的任务,当⼀些⼦窗⼝期间显⽰或隐藏的时候⾃动的调整对话框的⼤⼩,以保证对话框总是以优化了的⼤⼩显⽰。

在官⽅⽂档中setSizeConstraint给的解释为:sizeConstraint:SizeConstraint. This property holds the resize mode of the layout.这个函数主要是通过布局管理器对布局⼤⼩进⾏限制,与上⾯介绍的窗体⼤⼩有所不同。

函数SetFixedSize如下:void QWidget::setFixedSize(const QSize &s);设置控件的最⼤和最⼩尺⼨为s,防⽌控件⼤⼩的变化。

3.更改窗体图标⾸先在项⽬右键-->添加新⽂件,弹出如下对话框在左侧选中Qt,右侧选择Qt Resource File,然后Choose,页⾯如下:如果路径没错的话就⾃⼰命⼀个名字例如:icon,然后下⼀步,⼀路next知道完成。

qt的setwidgetfixedsize函数机制 -回复

qt的setwidgetfixedsize函数机制 -回复

qt的setwidgetfixedsize函数机制-回复在Qt中,setWidgetFixedSize函数是用来设置控件的固定大小的方法。

这个函数的机制与控件的布局和窗口大小调整有关,下面我将一步一步回答这个问题。

1. QWidget的布局机制:在Qt中,QWidget是所有可视控件的基类。

QWidget可以包含其他子控件,并根据布局管理器来对它们进行排列。

布局管理器会根据控件的大小和其它布局策略来自动调整子控件的位置和大小。

从而保证在不同平台和窗口大小下,控件的显示效果相同。

2. 控件的自动调整大小:QWidget控件默认会根据其所包含的子控件和布局管理器自动调整大小。

这意味着窗口大小调整时,控件会自动适应窗口的变化,并根据布局约束重新布置子控件。

而setWidgetFixedSize函数可以用来阻止控件自动调整大小,使其保持固定的尺寸。

3. setWidgetFixedSize函数的参数:setWidgetFixedSize函数的参数是一个QSize对象,用来指定控件的固定尺寸。

QSize类表示二维的大小,可以包含宽度和高度信息。

4. 调用setWidgetFixedSize函数时机:一般来说,setWidgetFixedSize函数会在控件的构造函数或初始化过程中被调用。

这样可以在显示控件之前确定其大小。

如果在控件已经显示后调用该函数,可能需要使用QWidget::update函数来强制刷新控件的显示,以确保新的尺寸生效。

5. setWidgetFixedSize函数的作用:使用setWidgetFixedSize函数可以实现以下效果:a) 确保控件的尺寸始终保持不变,不受窗口大小调整的影响;b) 阻止布局管理器对控件进行大小调整,使其始终显示为指定的固定大小;c) 如果控件是具有自定义绘制的子类,可以利用setWidgetFixedSize函数来控制控件的绘制区域,保证绘制效果的一致性。

Qt5:随窗口大小变化背景图片自动缩放的实现【转】

Qt5:随窗口大小变化背景图片自动缩放的实现【转】

Qt5:随窗⼝⼤⼩变化背景图⽚⾃动缩放的实现【转】在窗⼝程序中,当我们改变窗⼝⼤⼩的时候,背景图⽚通常会岁窗⼝⼤⼩变化⽽缩放然⽽,在我们写的窗⼝程序中,设置背景图⽚后,如果缩放⼤⼩,会看到背景图⽚并不会随之缩放,应为这需要特殊处理,⼀般常⽤的⽅法就是改变设为背景图⽚的 pixmap 的⼤⼩,在发⽣resize事件的时候,将改变完⼤⼩的pixmap重新设置为有新size窗⼝的背景图⽚主要的实现代码如下:亲测1//设置背景图⽚2void Widget::setBackgroundImage(QPixmap&pixmap)3 {4//判断图⽚是否为空5if(pixmap.isNull()){6 qDebug() << tr("illege arguments") <<endl;7return;8 }9//设置窗⼝的背景10 QPalette palette = this->palette();11 palette.setBrush(this->backgroundRole(),12 QBrush(pixmap.scaled(this->size(),13 Qt::IgnoreAspectRatio,14 Qt::SmoothTransformation)));15this->setPalette(palette);16 }1718//重载resizeEvent19void Widget::resizeEvent(QResizeEvent *)20 {21 setBackgroundImage(m_backPixmap);22 }值得注意的是,要使窗⼝的背景图⽚显⽰出来的时候, widget 的 autoFillBackground 属性⼀定要为 true,(调⽤ setAutoFillBackground(true) 就ok 了)。

qt实验六鼠标和键盘事件

qt实验六鼠标和键盘事件

break;
label = new QLabel( "Wellcome!", this ); label->setBackgroundColor( white ); QFont f( "Helvetica", 16, QFont::Bold ); label->setFont( f ); label->setGeometry( 25, 70, 250, 100 ); label->setAlignment( AlignVCenter | AlignHCenter ); 在构造函数的实现的时候,我们对窗口的标题、背景、文字字形以及标签的字形、背景 色和显示方式位置作出了一些设置。 void MouseKeyEvent::mousePressEvent( QMouseEvent *e ) {
的提供是为了保证旧代码能够工作。我们强烈建议在新代码中不要使用它。 QEvent::DeferredDelete - 在这个对象被清理干净之后,它将被删除。 QEvent::Accel -子键按下,用于快捷键处理。QKeyEvent。 QEvent::Wheel - 鼠标滚轮转动,QWheelEvent。 QEvent::ContextMenu - 上下文弹出菜单,QContextMenuEvent。 QEvent::AccelAvailable - 在一些平台上 Qt 使用的内部事件。 QEvent::AccelOverride - Key press in child, for overriding shortcut key handling,
break;
case MidButton:
label->clear();
label->setText( "Mouse:MidButton Pressed!" );

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。

网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。

Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。

我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。

要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

这部分具体的参数解释摘录如下:结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。

Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。

一个QSizePolicy的所有变量对水平方向和垂直方向都适用。

下面列举了一些最长用的值:A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。

控件不能小于这个sizeHint,但是可以放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小E. Expandint:控件可以自行增大或者缩小注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)所以对于需要根据窗口大小对应改变的部件我这里就设置为Expandint。

如何让控件随窗口大小自动调整位置和尺寸

如何让控件随窗口大小自动调整位置和尺寸

如何让控件随窗口大小自动调整位置和尺寸/ypxmaomao/blog/item/7294b8809a2833df9023d960.html2009年03月26日星期四15:46最笨的方法大概就是OnSize中按照新旧大小的比例算一下然后MoveWindow我在实际过程中碰见一个问题就是调整Crichedit时出错,后来才知道WM_SIZE执行在WM_CREATE前面. 所以调整Crichedit时要加判断条件if (IsWindow(m_testrich2.GetSafeHwnd())){m_testrich2.MoveWindow(crect,true);}--------------------------最后贴一下我的工程中部分代码-----------------------void CT alkDlg::OnSize(UINT nType, int cx, int cy){CRect crect;crect.left=5;crect.right=cx-117;crect.top=(300*cy)/410+2;//这些按照原先的比例计算出新的大小crect.bottom=cy-30;if (IsWindow(m_testrich.GetSafeHwnd()))//调整输入框{ //m_testrich.ShowWindow(SW_HIDE);m_testrich.MoveWindow(crect,true);}crect.top=5;crect.bottom=(300*cy)/410-24-2;if (IsWindow(m_testrich2.GetSafeHwnd()))//调整显示框{// m_testrich2.ShowWindow(SW_HIDE);m_testrich2.MoveWindow(crect,true);}crect.left=cx-175;crect.top=cy-28;crect.bottom=cy-5;crect.right=cx-117;m_btSend.MoveWindow(crect,true);//调整发送按钮crect.left=cx-175-80;crect.right=cx-117-80;m_close.MoveWindow(crect,true);//调整关闭按钮crect.top=(300*cy)/410-24;crect.bottom=(300*cy)/410;crect.right=cx-117-80+3;m_fstp.MoveWindow(crect,true);//调整发送图片按钮...........略=============================================================== =========方法2,使用别人写的类(我下了,还没用过,有需要的朋友如果下不了,可以留邮箱向我要)/source/1070512使用时,将其中的ControlPos.cpp和ControlPos.h文件引入工程中然后根据以下步骤进行操作:1:在需要处理的对画框的类定义中,定义一个操作对象(别忘了包含头文件ControlPos.h)class CYourDlg: public CDialog{............CControlPos m_cControlPos;}2:在该对话框的OnInitDialog中添加如下代码m_cControlPos.SetParent(this);3:接下来为每个要改变大小、位置的控件进行注册(自己编的词)m_cControlPos.AddControl(IDC_BUTTON1,CP_MOVE_HORIZONTAL) //使控件IDC_BUTTON1根据窗体大小的改变自动水平移动(其他样式见最后的“样式控制表”)4:最后,在该对话框的OnSize事件处理函数中添加如下代码:m_cControlPos.MoveControls();控制样式表:(4种样式可以任意组合)CP_MOVE_VERTICAL //垂直移动CP_MOVE_HORIZONTAL //水平移动CP_RESIZE_HORIZONTAL //改变宽度CP_RESIZE_VERTICAL //改变高度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

widget跟随窗口调整
UI界面控件随窗口自适应变化大小
通过Qt Creator的设计模式实现,无需增加代码。

如下图,实现对最下层tableview大小跟随窗口调整:
1、界面空白处右击,选择布局-->栅格布局,这会使centralWidget布局设置为GridLayout。

然后界面中的部件会自动添加到栅格布局中,此时的部件会根据窗口大小自动调整大小。

2、但是部件的大小却不是我们希望的,极不协调,接下来就需要调整每个控件的设置。

调整控件Size的项目包括:sizePolicy、minimumSize、maxmumSize
比如将上面的第三行的lineEdit限制高度:
这样,在调整窗口大小的时候,lineEdit控件只能任意改变宽度,而高度则被限制在30个像素内。

(调整之后效果)
注意:
有些情况下设置了上面的操作步骤之后,但似乎没有起作用。

比如上面例子中第一行的几个空间,虽然设置了sizePolicy以及宽度、高度限制,但是还是随着界面改变。

这个时候,就需要添加 Spacer(看起来像弹簧的控件),之后就能解决问题了。

这是因为GridLayout布局的影响,他必须让布局之内的区域布满控件,而不能有空白,所以即使设置了大小限制,仍然会被拉伸。

添加Spacer就是为了填充多余的区域。

相关文档
最新文档