Qt-组装丰富的积木

来源:互联网 发布:网络摄像头的安装方法 编辑:程序博客网 时间:2024/05/16 11:01

组装丰富的积木

把两个窗口部件封装成一个新的组件,将这个新的组建填充到4*4的网格布局里,并且最上方有quit按钮。

#include "mainwindow.h"#include <QApplication>#include <QPushButton>#include <QFont>#include <QSlider>#include <QLCDNumber>#include <QVBoxLayout>#include <QGridLayout>class LCDRange:public QWidget{    public:    LCDRange(QWidget *parent = 0);};LCDRange::LCDRange(QWidget *parent):QWidget(parent){    QLCDNumber *lcd = new QLCDNumber(2);    lcd->setSegmentStyle(QLCDNumber::Filled);    QSlider *slider = new QSlider(Qt::Horizontal);    slider->setRange(0,99);    slider->setValue(0);    connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)));    QVBoxLayout *part = new QVBoxLayout;    part->addWidget(lcd);    part->addWidget(slider);    setLayout(part);}class MyWidget:public QWidget{public:    MyWidget(QWidget *parent = 0);};MyWidget::MyWidget(QWidget *parent):QWidget(parent){    QPushButton *quit = new QPushButton("Quit");    quit->setFont(QFont("Times",18,QFont::Bold));    connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));    QGridLayout *grid = new QGridLayout;    for(int r = 0; r < 4; r++)        for(int c = 0; c < 4; c++)        {            LCDRange *lcdRange = new LCDRange;            grid->addWidget(lcdRange, r, c);        }    QVBoxLayout *layout = new QVBoxLayout;    layout->addWidget(quit);    layout->addLayout(grid);    setLayout(layout);}int main(int argc, char *argv[]){    QApplication a(argc, argv);    MyWidget w;    w.show();    return a.exec();}

结果截图:

这里写图片描述

每一个组件都是单独的,比如(0,0)位置的数值改变不影响其他区域。


遇到问题:不显示4*4组件。
解决方法:在LCDRange类中创建好slider和lcd后就应该将它们放在QVBoxLayout布局中,即垂直布局中。这样,在新建LCDRange类的对象时,每一个对象都有slider和lcd,代码如下。

QVBoxLayout *part = new QVBoxLayout;part->addWidget(lcd);part->addWidget(slider);setLayout(part);

如果缺少这一步,最后什么都不显示:

这里写图片描述

所以,如果同时存在不只一个窗口部件(例如两个按钮enter,quit)那么一定要将它们封装到QVBoxLayout垂直布局中,才可以同时显示,否则显示后面的那一个。

int main(int argc, char *argv[]){    QApplication a(argc, argv);    QWidget box;    box.resize(200,120);    //QVBoxLayout layout;    QPushButton quit("Quit",&box);    quit.setFont(QFont("Times",18,QFont::Bold));    QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit()));    QPushButton enter("Enter",&box);    enter.setFont(QFont("Times",18,QFont::Bold));    /*layout.addWidget(&quit);    layout.addWidget(&enter);    box.setLayout(&layout);*/    box.show();    return a.exec();}

结果截图:

这里写图片描述


在每个组件中显示不同的数或者随机数。

#define Random(x) (rand()%x)QSlider *slider = new QSlider(Qt::Horizontal);slider->setRange(0,99);connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)));slider->setValue(Random(99));

结果截图:

这里写图片描述