动态布局的例子,dynamic layout;包括滑块,进度条。刻度盘,旋转框等子控件。
//**************************************************************
#include <QApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Dialog dialog;
return dialog.exec();
}
//*****************************************************************
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QQueue>
QT_BEGIN_NAMESPACE
class QComboBox;
class QDialogButtonBox;
class QGridLayout;
class QGroupBox;
class QLabel;
class QPushButton;
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
private slots:
void buttonsOrientationChanged(int index);
void rotateWidgets();
void help();
private:
void createRotableGroupBox();
void createOptionsGroupBox();
void createButtonBox();
QGroupBox *rotableGroupBox;
QQueue<QWidget *> rotableWidgets;//控件队列,实现控件循环显示
QGroupBox *optionsGroupBox;
QLabel *buttonsOrientationLabel;
QComboBox *buttonsOrientationComboBox;
QDialogButtonBox *buttonBox;
QPushButton *closeButton;
QPushButton *helpButton;
QPushButton *rotateWidgetsButton;
QGridLayout *mainLayout;
QGridLayout *rotableLayout;
QGridLayout *optionsLayout;
};
#endif
//**********************************************************
/****************************************************************************/
#include <QtGui>
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
createRotableGroupBox();
createOptionsGroupBox();
createButtonBox();
mainLayout = new QGridLayout;
mainLayout->addWidget(rotableGroupBox, 0, 0);
mainLayout->addWidget(optionsGroupBox, 1, 0);
mainLayout->addWidget(buttonBox, 2, 0);
setLayout(mainLayout);
mainLayout->setSizeConstraint(QLayout::SetMinimumSize);
setWindowTitle(tr("Dynamic Layouts"));
}
void Dialog::buttonsOrientationChanged(int index)
{
////布局的大小限制(Constraint)模式:无限制(NoConstraint)
mainLayout->setSizeConstraint(QLayout::SetNoConstraint);
setMinimumSize(0, 0);
//获取方位(orientation)信息
Qt::Orientation orientation = Qt::Orientation(
buttonsOrientationComboBox->itemData(index).toInt());//转换成整数
if (orientation == buttonBox->orientation())//与原值一致则直接返回
return;
mainLayout->removeWidget(buttonBox);//删除按钮框
int spacing = mainLayout->spacing();//如果横向和纵向长度一致返回这个长度,否则返回-1
QSize oldSizeHint = buttonBox->sizeHint() + QSize(spacing, spacing);
buttonBox->setOrientation(orientation);//设置按钮框的布局方向(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()));
}
mainLayout->setSizeConstraint(QLayout::SetDefaultConstraint);
}
void Dialog::rotateWidgets()
{
Q_ASSERT(rotableWidgets.count() % 2 == 0);//断言:偶数个子部件
//foreach宏的实质就是在宏中定义循环申明部分,而不包括循环体。
//在使用的时候,紧接着写循环体就行了。
//foreach(variables ,container)关键字是Qt对c++的一个扩展,
// 主要用于按顺序历经容器(container)中的对象
foreach (QWidget *widget, rotableWidgets)
rotableLayout->removeWidget(widget);//删除子部件
rotableWidgets.enqueue(rotableWidgets.dequeue());//头部部件出队列后入队尾
const int n = rotableWidgets.count();
for (int i = 0; i < n / 2; ++i) {//变换控件显示的位置
rotableLayout->addWidget(rotableWidgets[n - i - 1], 0, i);
rotableLayout->addWidget(rotableWidgets[i], 1, i);
}
}
//帮助对话框
void Dialog::help()
{
QMessageBox::information(this, tr("Dynamic Layouts Help"),
tr("This example shows how to change layouts "
"dynamically."));
}
void Dialog::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();//返回子部件数
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 Dialog::createOptionsGroupBox()
{
optionsGroupBox = new QGroupBox(tr("Options"));//groupbox周围显示一个圈
buttonsOrientationLabel = new QLabel(tr("Orientation of buttons:"));
buttonsOrientationComboBox = new QComboBox;//Combo : 结合物, 联合体.下拉菜单
buttonsOrientationComboBox->addItem(tr("Horizontal"), Qt::Horizontal);//item:条目
buttonsOrientationComboBox->addItem(tr("Vertical"), Qt::Vertical);
//void QComboBox::addItem ( const QString & text,
// const QVariant & userData = QVariant() )
//Combo中的索引值(index)改变的信号连接到信号槽buttonsOrientationChanged(int)
connect(buttonsOrientationComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(buttonsOrientationChanged(int)));
optionsLayout = new QGridLayout;
optionsLayout->addWidget(buttonsOrientationLabel, 0, 0);
optionsLayout->addWidget(buttonsOrientationComboBox, 0, 1);
optionsLayout->setColumnStretch(2, 1);//设置第二列的延伸属性(stretch factor)
optionsGroupBox->setLayout(optionsLayout);
}
void Dialog::createButtonBox()
{
buttonBox = new QDialogButtonBox;
closeButton = buttonBox->addButton(QDialogButtonBox::Close);//标准关闭按钮
helpButton = buttonBox->addButton(QDialogButtonBox::Help);//标准帮助按钮
rotateWidgetsButton = buttonBox->addButton(tr("Rotate &Widgets"),
QDialogButtonBox::ActionRole);
connect(rotateWidgetsButton, SIGNAL(clicked()), this, SLOT(rotateWidgets()));
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
connect(helpButton, SIGNAL(clicked()), this, SLOT(help()));
}
分享到:
相关推荐
Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局...
动态布局,实现空间在界面上填充,当空间大小变化实现自动换行。
QT实现动态布局 博客:QT实现动态布局 地址:https://tinycool.blog.csdn.net/article/details/124525866
QtFlowlayout 流式布局器 源代码,可根据QWidget控件内的数量自动布局界面
QT 例子QT 例子QT 例子QT 例子QT 例子
本例中,使用了水平,垂直,表格布局
QT动态添加控件,并且自动布局
Qt FlowLayout布局 Qt FlowLayout布局 Qt FlowLayout布局 Qt FlowLayout布局
Qt5开发及实例 第3章 Qt 5布局管理
QT串口通信例子,实现了QT用串口进行通信的例子
QT 例程 布局管理 包含多个小测试程序 学习QT的基础程序
qt 最基础 最详细的 layout 基本布局 源代码 很适合基础薄弱的下载,学习这个之后你会对qt有很大的了解
Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt共享内存代码例子Qt...
QT通用界面设计例子 通用 模板 例子 QT 界面设计 亲测好用 可以直接打开工程使用 、
利用Qt的网格布局,实现控件的动态加载删除,同时获取控件的文本信息(基于Qt5.9.8),对于Qt本身Qlineedit的在网格布局中的应用场景。
基于jquery和jquery ui的自动布局,并支持直接调整每个模块的大小和调整位置,且方便与后台传送数据。在鼠标移动至每个模块上时,右下角会出现调整的图标,可进行drag和resize。其中的插件gridstack是在github中查找...
本事例用Qt编写了一个ActiveX 使用的vs2010 Qt4.8.0
5. Qt工厂模式例子 6. 简单工厂模式 部分源码实例: // 奔驰工厂 class BenzFactory : public AFactory { public: ICar* CreateCar() { return new BenzCar(); } }; // 宝马工厂 class BmwFactory : public A...
qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子qt4 例子