• 3.Dynamic Layout 动态布局。在槽中处理布局


    在应用程序中,一个界面的布局基本都是固定的。

    在这个实例中,我们把管理布局的代码放在槽中。这样点击一次按钮,触发槽。布局改变一次。这样就成为一个动态布局。

    (一) 水平和竖直布局改变

    横向:

          

    纵向:

          

    明显我们改变combobox中的选项。整个布局的界面就会变化。明显信号就是combobox中的

    currentIndexChanged(int index),我们设计槽处理这个信号。

    if(index == 0) {
    
            buttonLayout->addWidget(button1, 0, 0);
            buttonLayout->addWidget(button2, 0, 1);
            buttonLayout->addWidget(button3, 0, 2);
    
            mainLayout->removeWidget(buttonGroupBox);
            mainLayout->addWidget(buttonGroupBox, 2, 0);
    
            setLayout(mainLayout);
    
            return ;
    
        }
    
        if(index == 1) {
    
            buttonLayout->addWidget(button1, 0, 0);
            buttonLayout->addWidget(button2, 1, 0);
            buttonLayout->addWidget(button3, 2, 0);
    
            mainLayout->removeWidget(buttonGroupBox);
            mainLayout->addWidget(buttonGroupBox, 0, 1);
    
            setLayout(mainLayout);
    
            return;
    
        }

    需要重新布局的控件。先调用QLayout中的removeWidget方法。然后再添加进来。

    不过此时要改变在QGridLayout中的行列,实现水平和竖直布局。

    (二)旋转控件。

    初始状态:

          

    旋转:

          

    思路和上一个例子一样。先做好初始的布局。

    然后再槽中 removeWidget()删除所有的控件。重新布局。

    void Dialog::create()
    {
        widgetGroupBox = new QGroupBox(tr("Rotate Widgets"));
        rotateButton = new QPushButton(tr("Rotate Widget"));
    
        queue.enqueue(new QSpinBox());
        queue.enqueue(new QProgressBar());
        queue.enqueue(new QSlider());
        queue.enqueue(new QDial());
    
        int n = queue.count();
    
        for(int i=0; i<n; i++) {
            connect(queue[i], SIGNAL(valueChanged(int)), queue[(i+1)%n], SLOT(setValue(int)));
        }
    
    
        boxLayout = new QGridLayout;
        widgetGroupBox->setLayout(boxLayout);
    
        rotateWidget();
    
    }
    void Dialog::rotateWidget()
    {
        Q_ASSERT(queue.count() % 2 == 0);
    
        foreach (QWidget * w, queue) {
            boxLayout->removeWidget(w);
        }
    
        queue.enqueue(queue.dequeue());
    
        int n = queue.count();
    
        for(int i=0; i<n/2; i++) {
            boxLayout->addWidget(queue[n-1-i], 0, i);
            boxLayout->addWidget(queue[i], 1, i);
        }
    }

    第一次的布局也是调用rotateWidget函数实现的。可见,当布局为空。里面没有控件时,调用removeWidget函数也不会使程序报错。

    完整代码:https://github.com/Satius/qt5/tree/master/qtbase/examples/widgets/layouts/dynamiclayouts

        

  • 相关阅读:
    JavaScript之函数(上)
    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)<转>
    Mac配置环境变量注意点
    netty tcp拆包
    mybatis注解方式批量插入数据
    JMX超详细解读<转>
    使用EmbeddedValueResolverAware读取配置文件内容
    线程的几种状态转换<转>
    Java线程池关闭1-shutdown和isTerminated<转>
    Maven项目编译后classes文件中没有.xml问题
  • 原文地址:https://www.cnblogs.com/billxyd/p/6982787.html
Copyright © 2020-2023  润新知