• Qt入门(17)——组装复杂的控件


    下面是如何把两个窗口部件封装成一个新的组件。首先,我们使用一个自定义的窗口部件作为一个子窗口部件。


    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qslider.h>
    #include <qlcdnumber.h>
    #include <qfont.h>
    #include <qvbox.h>
    #include <qgrid.h>
    
    
    class LCDRange : public QVBox
    {
    public:
        LCDRange( QWidget *parent=0, const char *name=0 );
    };
    
    
    LCDRange::LCDRange( QWidget *parent, const char *name )
            : QVBox( parent, name )
    {
        QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );
        QSlider * slider = new QSlider( Horizontal, this, "slider" );
        slider->setRange( 0, 99 );
        slider->setValue( 0 );
        connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
    }
    
    
    class MyWidget : public QVBox
    {
    public:
        MyWidget( QWidget *parent=0, const char *name=0 );
    };
    
    
    
    
    MyWidget::MyWidget( QWidget *parent, const char *name )
            : QVBox( parent, name )
    {
        QPushButton *quit = new QPushButton( "Quit", this, "quit" );
        quit->setFont( QFont( "Times", 18, QFont::Bold ) );
    
    
        connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
    
    
        QGrid *grid = new QGrid( 4, this );
    
    
        for( int r = 0 ; r < 4 ; r++ )
            for( int c = 0 ; c < 4 ; c++ )
                (void)new LCDRange( grid );
    }
    
    
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );
    
    
        MyWidget w;
        a.setMainWidget( &w );
        w.show();
        return a.exec();
    }
    



    解释:
        class LCDRange : public QVBox
        {
        public:
            LCDRange( QWidget *parent=0, const char *name=0 );
        };


    LCDRange窗口部件是一个没有任何API的窗口部件。它只有一个构造函数。这种窗口部件不是很有用,所以我们一会儿会加入一些API。

        LCDRange::LCDRange( QWidget *parent, const char *name )
                : QVBox( parent, name )
        {
            QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );
            QSlider * slider = new QSlider( Horizontal, this, "slider" );
            slider->setRange( 0, 99 );
            slider->setValue( 0 );
            connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
        }



    这里直接利用了第五章里面的MyWidget的构造函数。唯一的不同是按钮被省略了并且这个类被重新命名了。

        class MyWidget : public QVBox
        {
        public:
            MyWidget( QWidget *parent=0, const char *name=0 );
        };



    MyWidget也是除了一个构造函数之外没有包含任何API。
        MyWidget::MyWidget( QWidget *parent, const char *name )
                : QVBox( parent, name )
        {
            QPushButton *quit = new QPushButton( "Quit", this, "quit" );
            quit->setFont( QFont( "Times", 18, QFont::Bold ) );
    
    
            connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );




    这个按钮被放在LCDRange中,这样我们就有了一个“Quit”按钮和许多LCDRange对象。


            QGrid *grid = new QGrid( 4, this );
    我们创建了一个四列的QGrid对象。这个QGrid窗口部件可以自动地把自己地子窗口部件排列到行列中,你可以指定行和列的数量,并且QGrid可以发现它的新子窗口部件并且把它们安放到网格中。


            for( int r = 0 ; r < 4 ; r++ )
                for( int c = 0 ; c < 4 ; c++ )
                    (void)new LCDRange( grid );
    四行,四列。


    我们创建了一个4*4个LCDRanges,所有这些都是这个grid对象的子窗口部件。这个QGrid窗口部件会安排它们。


        }
    这就是全部了。
  • 相关阅读:
    最新免费网络加速器,游戏加速器下载_网络加速器永久免费版哪个好?
    HTML中特殊符号编码对照表,html特殊符号编码都有哪些?
    超融合架构在汽车行业前景及未来发展
    好用的前端开发小工具
    layui省市区三级联动城市选择
    企业超融合解决方案怎么做?超融合基础架构 超融合优势是什么?
    最新免费网络加速器
    什么是超融合?
    面临网络安全危机时需要思考的20个问题
    2019年超融合将飞速发展 三大趋势不容错过
  • 原文地址:https://www.cnblogs.com/new0801/p/6176883.html
Copyright © 2020-2023  润新知