这次,我们学习下面几个问题:
- 动态变更布局
- QQueue的使用
- 组件之间的联动
参考来源:http://doc.qt.nokia.com/latest/layouts-dynamiclayouts.html
,最终布局如图所示,并实现相关的动态变更。
- 一个dialog分为三个部分;
- 第一部分是一个GroupBox,里面是GridLayout(2,2)的方式,按Rotate Widget的按钮,顺时针旋转里面组件的位置。这四个组件是可以联动的,一个修改,另外三个显示值也跟随修改。此四个组件存放在QQueue中。
- 第二部分也是一个GroupBox,根据comboBox的选择,确定第三部分的位置。
- 第三部分是DialogButtonBox,有两个Dialog的button,close和help,增加一个旋转按钮“Rotate Widget”
一、创建程序主体,采用dialog的方式。在之前,我们讨论过dialog的主体如何创建,不再重复。MyDialog类继承QDialog。
二、旋转第一部分的四个组件
在mydialog.h:
private:
/* 第一部分的组件*/
QGroupBox *rotableGroupBox;
QQueue<QWidget *> rotableWidgets;
QGridLayout *rotableLayout;
在mydialog.cpp:
void MyDialog :: createRotableGroupBox()
{
rotableGroupBox = new QGroupBox(tr("Rotable Widgets"));
rotableWidgets.enqueue(new QSpinBox);
rotableWidgets.enqueue(new QSlider);
rotableWidgets.enqueue(new QDial);
rotableWidgets.enqueue(new QProgressBar);
int n = rotableWidgets.count();
/*这里设置联动,注意以前第三个参数我们通常使用this,表示调用当前类的函数,对于联动,我们需要调用其他组件的函数,所以这里为其他组件,第一动,导致第二动,第二动,导致第三动,一直所有的都改变,否则一直传递下去*/
for (int i = 0; i < n; ++i) {
connect
(rotableWidgets
[i], SIGNAL(valueChanged
(int)), rotableWidgets
[(i+1)%n], SLOT(setValue
(int)));
}
rotableLayout = new QGridLayout;
rotableGroupBox ->setLayout(rotableLayout);
rotateWidgets();
}
void MyDialog :: rotateWidgets() //这也同时是slot函数
{
//删除面板上的组件
foreach(QWidget * widget ,rotableWidgets)
rotableLayout->removeWidget
(widget);
//删除head的的item,并将其加到最后,这样我们实现旋转。
rotableWidgets.enqueue
(rotableWidgets.dequeue
());
rotableLayout->addWidget(rotableWidgets[0],1,0);
rotableLayout->addWidget(rotableWidgets[1],1,1);
rotableLayout->addWidget(rotableWidgets[2],0,1);
rotableLayout->addWidget(rotableWidgets[3],0,0);
}
三、横向/纵向模式,自从iphone引入了重量感应器后,一个程序出现横向和纵向的排版,通常都是一样,但是有些程序也提供不同的布局。这里给了一个例子。
在mydialog.h:
private:
/* 第二部分的组件*/
QGroupBox *optionsGroupBox;
QGridLayout *optionsLayout;
QLabel *buttonsOrientationLabel;
QComboBox *buttonsOrientationComboBox;
/* 第三部分的组件*/
QDialogButtonBox *buttonBox;
QPushButton *closeButton;
QPushButton *helpButton;
QPushButton *rotateWidgetsButton;
在mydialog.cpp:
void MyDialog :: buttonsOrientationChanged(int index)
{
//由于我们改变排版,因此新的布局的size可能比原来的小,但是widget的resize比它最小的widget大小。通过setMinmumSize(0,0)来reset。简单来讲,如果我们每次修改布局都希望不受限制设定新的尺寸,reset最小尺寸。
setMinimumSize(0,0);
//方向有两个参数Qt::Horizontal 0x1, Qt::Vertical 0x2,在我们这里0为Horizontal,1为vertical。
Qt::Orientation
orientation = Qt::Orientation(index + 1);
if(buttonBox->orientation() == orientation ) //方向没有改变
return;
mainLayout->removeWidget(buttonBox); //删除原来的buttonBox,后面在其他位置加上
int spacing = mainLayout->spacing();
QSize oldSizeHint = buttonBox->sizeHint() + QSize(spacing,spacing);
buttonBox->setOrientation(orientation);
QSize newSizeHint = buttonBox->sizeHint() + QSize(spacing,spacing);
if(orientation == Qt::Horizontal){
mainLayout->addWidget(buttonBox,2,0); //新的位置,放置最下面
resize(size() + QSize(-oldSizeHint.width()
, newSizeHint.height())); //设置合适的大小
}else{
mainLayout->addWidget(buttonBox,0,3,2,1); //新的位置,放置最右面
resize(size() + QSize(newSizeHint.width(), -oldSizeHint.height()
)); //设置合适的大小
//resize(minimumSize().width(), minimumSize().height()); 这样可以得到最紧凑的排列,但是我们希望其他部分不变动,所以我们根据计算进行排版。
}
}
四、对于第二部分:第二部分只有两个组件,占空间比较小,当我们将dialog拉框的时候,我们希望这两个组件都放置在最左边,右边以空白补充。如下,我们在GruiLayout中增加一个空白类。
//这里设置延伸的情况,我们希望后面空白将填满剩余的空间,所以设置第2列具有更高的延伸因子,如果我们希望第1列的combobox将填满剩余的俄空间,setColumnStretch(1,1),可以拉常dialog来看看效果。
optionsLayout->setColumnStretch
(2,1);
五、Dialog的提供的缺省button。使用QDialogButtonBox * buttonBox,在里面我们加入两个系统button,Close和Help,以及一个自定义的button,如下
closeButton = buttonBox->addButton(QDialogButtonBox::Close
);
helpButton = buttonBox -> addButton(QDialogButtonBox::Help
);
rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widget"),QDialogButtonBox::ActionRole
);
connect(rotateWidgetsButton,SIGNAL(clicked()),this,SLOT(rotateWidgets()));
connect(closeButton,SIGNAL(clicked()),this,SLOT(close
())); //close是系统的,即继承QDialog
connect(helpButton,SIGNAL(clicked()),this,SLOT(myhelp())); //myhelp是自定的
一些思考:点解中国的中小学生学着全世界最复杂的数理化,而我们的大学毕业生的素质如此低下?这个问题曾经很奇怪。实际上看看中小学的教育就知道。填鸭式的教育,目的是教会知识。而不是教会如何学习知识,更不是如何享受学习的乐趣。如果只是知识,在网上查查就可以,而如何学习知识,是人的学习能力,如何独立思考,是人的创新能力。不学会质疑,如何学会创新?
相关链接:我的MeeGo/Moblin相关文章
分享到:
相关推荐
QT布局(Layout)是Qt库中的一个重要特性,用于在用户界面上自动管理和调整控件的排列方式。在GUI设计中,良好的布局管理可以确保界面在不同屏幕尺寸和分辨率下都有良好的显示效果。本例中涉及到了三种基本类型的...
QtFlowlayout是一个专门为Qt开发的自定义布局器,它扩展了Qt的标准布局系统,使得在QWidget容器中可以灵活地自动布局子控件。这个库的主要目的是处理那些在大小和数量上变化不定的控件,例如在一个应用中,用户可能...
QT布局是Qt库中一种强大的功能,用于在用户界面上管理控件的排列和尺寸调整。在QT中,布局管理器能够自动调整控件的位置和大小,以适应窗口的变化,从而提供灵活且响应良好的界面。本文将深入探讨如何在QT中实现动态...
Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局...
Qt FlowLayout布局是一种在Qt应用开发中用于组织控件的自定义布局管理器。与标准的Qt布局(如QVBoxLayout、QHBoxLayout和QGridLayout)不同,FlowLayout允许控件按照特定的方向(水平或垂直)流式排列,当空间不足时...
在QT5中,布局管理器(QLayout)是构建用户界面的重要工具,它负责自动调整控件的位置和大小以适应窗口的变化。在本主题中,我们将深入探讨QT5中的卡片布局(CardLayout),特别是基于QLayout的CardStackLayout,...
在这个压缩包中,我们聚焦于“Layout”——Qt中的基本布局管理机制,这对于理解和创建高效、适应性强的用户界面至关重要。 布局管理在Qt中扮演着关键角色,它允许你自动调整控件(如按钮、文本框等)的位置和大小,...
Qt实现流式布局 将控件从左至右排列,一行排列不下时,会自动换到下一行继续排列 来源自Qt的example 链接:http://doc.qt.io/qt-4.8/qt-layouts-flowlayout-example.html
除Qt Designer支持可视化设计和布局界面之外,Qt 提供了代码方式来进行界面布局, 以下是几种常用的界面布局方式: 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout): QHBoxLayout和QVBoxLayout分别用于水平和...
【Qt】Qt窗口几何布局是Qt编程中的一个重要概念,它涉及到如何在Qt应用程序的窗口中有效地组织和管理控件的布局。Qt提供了一套强大的布局管理机制,使得开发者可以轻松地调整窗口中控件的位置和大小,以适应不同...
QT动态布局类的实现主要涉及的是Qt库中的布局管理机制,这是GUI编程中非常重要的一部分,它可以帮助我们构建灵活、响应式且易于维护的用户界面。本文将深入探讨`QGridLayout`和`QLayout`,以及如何利用它们实现动态...
基于jquery和jquery ui的自动布局,并支持直接调整每个模块的大小和调整位置,且方便与后台传送数据。在鼠标移动至每个模块上时,右下角会出现调整的图标,可进行drag和resize。其中的插件gridstack是在github中查找...
在QT编程中,动态添加控件以及实现自动布局是一项常用且重要的技能。这涉及到QT的两种主要布局管理器:QLayout和QWidgetItem,以及可能用到的QVBoxLayout、QHBoxLayout、QGridLayout等布局类型。本篇文章将深入探讨...
QT提供了一套强大的布局管理器系统,包括网格布局(QGridLayout)、水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)以及流式布局(QFormLayout)等,这些布局工具可以帮助开发者实现各种复杂或简单的界面设计。...
Qt代码布局原理是Qt开发中的核心概念之一,它关乎到用户界面(UI)的设计和管理。在Qt中,布局管理器允许我们动态地调整控件的位置和大小,以适应不同屏幕尺寸和分辨率的变化,从而提高应用程序的用户体验。下面将...
在QT编程中,布局管理是构建用户界面时非常重要的一个部分。它可以帮助开发者自动调整控件的位置和大小,以适应窗口的变化。在这个“qt中的布局实例”中,我们看到一个使用了`QGridLayout`和`QGroupBox`的例子,这...
5. 将布局设置为窗口的布局,`setLayout(layout)`。 6. 可能还有`show()`方法来显示窗口。 通过实践这些布局实例,你可以更好地理解QT布局的工作原理,并学会如何根据需求选择合适的布局类型。这将有助于你创建更...
在本文中,我们将深入探讨Qt框架中的网格布局(Grid Layout)及其在实际应用中的使用方法。Qt是一个跨平台的应用程序开发框架,广泛用于创建桌面、移动和嵌入式应用程序。网格布局是Qt Widgets模块中的一种布局管理...
简单地利用QT的网格布局,文档里有pro .h .cpp main除了利用网格布局,计算部分使用QString转成double型,输出文本框用double再转成QString
在本"QT界面水平布局demo"中,我们将关注如何使用QT的布局管理器来实现水平布局。 在QT中,布局管理器是用于自动调整和组织窗口小部件(widgets)的一种机制,它可以根据窗口大小的变化或小部件的增减自动调整布局...