精华内容
下载资源
问答
  • qt动态创建控件

    2020-05-15 09:05:41
    qt动态创建控件 mainwindows.h #include<QVector> #include<QPushButton> 创建成员变量 QVector<QPushButton*> buttons; mainwindows.cpp for(int i=0; i<10;i++) { buttons.clear(); ...

    qt动态创建控件

    mainwindows.h

    #include<QVector>
    #include<QPushButton>
    创建成员变量
    QVector<QPushButton*> buttons;
    

    mainwindows.cpp

    forint i=0; i<10;i++{
    	buttons.clear();
    	buttons.append(new QPushbutton(this));
    }
    

    更新

    这种动态创建方式代码放到构造函数内是没有问题的,可是放到非构造函数内需要在代码最后加上

    buttons[i].show()
    

    才会显示出来。

    展开全文
  • qt动态创建窗体

    2017-04-18 18:11:26
    在指定区域拖拉出一个新窗体,此窗体可改变大小,可移动,可叠加,可关闭.
  • qt 动态创建控件

    热门讨论 2014-06-06 13:30:11
    简介:根据选择的栏目 和每行要显示的控件数,创建控件
  • QT 动态创建对象

    千次阅读 2015-05-02 11:57:27
    在我继续一系列的Qt数据序列化文章之前,有一个相对重要的需要提及的话题,那就是:基于类名动态创建类对象的能力。 假定现在我们要创建一系列的形状,形状是一个抽象类,实际类是存储在一个列表中的各种各样的...

    原文:http://www.mimec.org/node/350

    在我继续一系列的Qt数据序列化文章之前,有一个相对重要的需要提及的话题,那就是:基于类名动态创建类对象的能力。

            假定现在我们要创建一系列的形状,形状是一个抽象类,实际类是存储在一个列表中的各种各样的派生类:矩形、圆等等。在序列化期间,我们可以保存每一项的类名和对象数据,在反序列化(即加载数据)时,我们需要能够创建合适类实例的能力,这就是要用到一个对象工厂的地方。在支持反射的语言中,例如C#、Java,仅需要几行代码就可以从一个跟定的类名字符串获得一个类实例。但是在c++中没有这样的机制。

           一个简单的解决方案是创建一个单独的函数,里面有一个大的switch块(或者一系列的switch块)来创建合适的类对象,尽管这种方法不雅观并且破坏了面向对象设计,但是大多数情况下是可以接受的。然而,当你有很多的类而且分散在应用程序的不同模块时,使用上述方法可能会变得难以管理,而且当应用程序有扩展的模块和动态加载的插件时,这就会变得更加困难。

          另一个更优雅的解决方法是有一个不需要知道任何对象类型的工厂,而要通过工厂实例化的类必须使用某种内部图来先注册,这样,每个模块或插件可以独立的注册它们各自类。

           QT有两种可以用来创建这样的工厂的机制,它们看起来相似,实际上有很大的差别:

           QMetaType

           construct()方法能够用来创建任何内建类型的实例,或者是通过Q_DECLARE_METATYPE宏指定的自定义类型。这是QVariant所要做的,用来内部封装自定义类型。然而这种机制是用来供变量类型使用的,也就是有默认构造和拷贝函数的类,但是对于抽象类对象是没有意义的,因为抽象类通常使用指针传递,并且拷贝构造通常被禁用。

           QMetaObject

           newInstance()方法可以用来创建任何一个从QObject派生下来的类的实例,仅有的条件是类的构造器必须通过Q_INVOKABLE修饰,来明确地声明。这和多态对象配合可以很好的工作,因为QObject类通常作为各种抽象类的基类。值得注意的是,从QT4开始,若没有额外的工作,仅仅依靠类名是不可能检索到QMetaObject的。

     

           可以很容易的创建一个依赖于QMetaObject的对象工厂,这里有一种实现,不过这种解决方法也有一些缺点:
           构造器必须使用Q_InVOKABLE显示声明,以便能够访问QMetaObject;

           没有在编译期检查是否存在合适的构造函数可以访问,或者参数类型是否正确,当你实际尝试创建实例时,仅仅会得到一个运行时警告,并返回空指针;

          子类化QObject会增加每个对象实例的内存占用,当执行运行时类型检查时,通过QMetaObject进行的动态方法调用也会存在一些开销。

     

          然而,创建一个可以创建任何类的自定义类工厂也不是难事,下面是一个适用于任何继承于QObject的类的创建工厂:

    class ObjectFactory
    {
    public:
        template<typename T>
        static void registerClass()
        {
            constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
        }
    
        static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
        {
            Constructor constructor = constructors().value( className );
            if ( constructor == NULL )
                return NULL;
            return (*constructor)( parent );
        }
    
    private:
        typedef QObject* (*Constructor)( QObject* parent );
    
        template<typename T>
        static QObject* constructorHelper( QObject* parent )
        {
            return new T( parent );
        }
    
        static QHash<QByteArray, Constructor>& constructors()
        {
            static QHash<QByteArray, Constructor> instance;
            return instance;
        }
    }; 

     

           使用这种途径,不在需要使用Q_INVOKABLE声明构造器了,而且如果没有找到合适的构造器,只要这个类注册了,在constructorHelper()方法中就会报告一个编译错误。而且代码很容易使用:

    ObjectFactory::registerClass<Foo>();
    
    // ...
    
    QObject* foo = ObjectFactory::createObject( "Foo" );


          同时也很容易修改这个代码,来适用于那些不从QObject继承的自定义抽象类,例如它可以使用任何传递给registerClass()方法或者自动从类的静态成员接收的类型的“Key”,而不是使用从OMetaObject接收的类名作为“Key”.根据需要还有一组不同的参数可以传递给构造函数。

     

    展开全文
  • Qt动态创建控件并实现布局

    万次阅读 2018-01-24 15:05:04
    最近搞的一些需求有相关的设计,从网上找来一段代码,受到一些启发,记下来备用。 有相关需求的可以参考 直接上代码: if(icreateControlNumdisplay_num_Line) { rownum=1;... {

    最近搞的一些需求有相关的设计,从网上找来一段代码,受到一些启发,记下来备用。

    有相关需求的可以参考


    直接上代码:


    if(icreateControlNum<=display_num_Line)

    {
            rownum=1;
            display_num_Line=icreateControlNum;
       }
       else
       {
           //选择栏目个数除以每行要显示个数
           iitem=icreateControlNum%display_num_Line;
           //行数整数
           rownum=icreateControlNum/display_num_Line;
           if(iitem)
               //如果有余数则向上取整  说明最后一行栏目个数小于规定的数目;余数则是最后一行要显示的栏目个数
               rownum+=1;
       }
    
    
    上边这一段是确定几行几列


    下边是核心的代码:

    m_gLayout  阑珊布局

    for(int i=0;i<rownum;i++)//行

       {
           lineEditindex=0;
     
    
           //如果是最后一次循环且最后行元素不是初始display_num_Line个,则重新赋值display_num_Line
           if(i+1==rownum &&iitem)
               display_num_Line=iitem;
     
    
           for(int j=0;j<display_num_Line;j++)//每行列数
           {
               m_gLayout->addWidget(m_labelcreate.at(itemIndex),i,j+lineEditindex);
               m_gLayout->addWidget(m_lineEditcreate.at(itemIndex),i,j+lineEditindex+1);
     
    
               ++itemIndex;
               ++lineEditindex;
           }
       }



    展开全文
  • QtQuick动态创建组件

    千次阅读 2016-06-19 21:02:32
    1.Qt.createComponent 创建组件对象 createObject指定父元素 **Ani.Qml AnimatedImage { id: animation; source: "qrc:/T.gif" width: 40 height: 40 } **Text.Qml Text{ width: 40 height: 40 text: "H

    1.Qt.createComponent 创建组件对象 createObject指定父元素

    **Ani.Qml
    AnimatedImage {
    
    
        id: animation; source: "qrc:/T.gif"
    
    
        width: 40
        height: 40
    }
    
    **Text.Qml
    Text{
        width: 40
        height: 40
        text: "Hello"
        verticalAlignment: Text.AlignBottom
    }
    
    **main.Qml
    import QtQuick 2.7
    import QtQuick.Controls 2.0
    import QtQuick.Layouts 1.0
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
        property var ff: 0
        SwipeView {
            id: swipeView
            anchors.fill: parent
            currentIndex: tabBar.currentIndex
    
            Page{
    
                Flow{
                    id:grid 
                    spacing: 0
                    width: swipeView.width
                    height: swipeView.height
    
                    Button{
                        text: "hello"
                        onClicked: {
                            ff++;
                            if(ff%2==0)
                            {
                                loadButton()
                            }else{
                                loadImg()
                            }
    
    
                        }
    
                        function loadButton() {
                            var obj = Qt.createComponent("Text.qml");
                            if (obj.status == Component.Ready) {
                                var txt = obj.createObject(grid); 
                            }
                        }
    
    
                        function loadImg() {
                            var obj = Qt.createComponent("Ani.qml");
                            if (obj .status == Component.Ready) {
                                var img = obj .createObject(grid);
                            }
                        }
                    }
                    Button{
                        text: "hello"
                    }
                    Button{
                        text: "hello"
                    }
                    Button{
                        text: "hello"
                    }
                    Button{
                        text: "hello"
                    }
    
                }
    
    
                MouseArea{
                    onClicked: {
                        parent.loadButton()
                    }
                }
            }
    
    
        }
    
        footer: TabBar {
            id: tabBar
            currentIndex: swipeView.currentIndex
            TabButton {
                text: qsTr("First")
            }
            TabButton {
                text: qsTr("Second")
            }
        }
    }

    这里写图片描述

    简化:Gobal.js

    **Gobal.js
    .pragma library
    var Component_Ready =1;
    function  createxx(file,parent)
    {
        var component = Qt.createComponent(file);
        if (component.status == Component_Ready) {
            var button = component.createObject(parent);
            return  button;
        }
    
        return null;
    }
    ***********
    import "Gobal.js"   as  Helper
      function loadButton() {
                          var obj =   Helper.createxx("Button.qml",grid);
                             if(obj!=null)
                            {
                                obj.color ="red"
                            } 
                        }

    2.使用createQmlObject创建,不建议使用

    展开全文
  • QT通过JavaScript动态创建QML对象通过JavaScript动态创建QML对象动态创建对象动态创建组件从QML字符串创建对象维护动态创建的对象动态删除对象 通过JavaScript动态创建QML对象 QML支持从JavaScript内部动态创建对象...
  • Qt 动态创建 在到最后完成就可以看到项目 将xxxx_global.h文件中的内容放到 dlldemo.h文件中 在.h和.cpp写自己的方法如图 然后编译就会有下面的界面 不用管 这样你的动态库就完成了 。下面是找到动态库的...
  • QtQuick Rctange 动态创建一个rectange 高度随创建增加  
  • qt动态 创建 对象 二维数组 二维数组指针 Coin * coins[4][4]; 111
  • 现在我们看看如何动态创建、销毁组件。下面是dynamic_component.qml:这次我们在界面上放一个按钮,通过按钮...图5是颜色选择组件显示后的效果图:图5颜色组件创建后的效果使用Loader控制组件的动态创建与销毁,只是Qt
  • 创建QT对话框工程,动态创建多个按钮,把动态创建的按钮存放在QList中,并关联同一个信号槽函数,在该槽函数中根据按钮对象名称各自进行其他事项处理。 在mainwindow.h文件添加 #ifndef MAINWINDOW_H #define ...
  • 具体实现见我的文章地址如下: http://blog.csdn.net/csdn83419527/article/details/78840798 功能很简单就是把创建和使用动态库说清楚而已
  • Qt创建不依赖QT自身头文件包含的动态库 在使用Qt创建动态库的过程中,里面有2个头文件,一个是依赖关系的头文件,里面包含QtCore/qglobal.h;另一个是自己生成类的头文件,此头文件又包含前一个头文件。有时候...
  • 动态库(共享库)的创建Qt Creator中新建项目,选择Library 点击“Choose”进入下一步选择创建库的类型:共享库选择Kit套件选择需要的模块配置工程路径、名字等Qt Creator自动创建的文件我配置的动态库名字为:...
  • Qt 手动创建动态

    千次阅读 2018-06-04 23:58:52
    报错Project ERROR: Cannot run compiler 'g++'. Maybe you forgot to setup ...Error while parsing file E:\test\qt\src\libdll\libdll.pro. Giving up.设置环境变量D:\Qt\Qt5.9.3\Tools\mingw530_32\bin手动编写...
  • vs2010+QT5.5.1,此程序用于学习使用QT库读取xml文件,json文件,sqlite数据库,ini文件,以及QT10个基本控件的使用,同时代码中加入了一点设计模式,提高可扩展性降低耦合性并减少开销
  • Component是由Qt框架或开发者封装好的、只暴露了必要接口的QML类型,可以重复利用。一个QML组件就像一个黑盒子,它通过属性、信号、函数和外部世界交互。一个Component即可以定义在独立的qml文件中,也可以嵌入到...
  • Qt创建动态

    2014-11-04 15:28:23
    本文通过两个简单的例子演示了如何使用Qt创建基于Qt应用及本地应用的动态链接库。 1. 创建基于Qt GUI应用的动态库 1.1. 创建动态库 1.1.1. 启动Qt Creator依次选择 “文件/新建文件或工程...”,在弹出的...
  • 6-Qt5创建C++动态库DLL

    2019-08-27 16:19:26
    6-Qt5创建C++动态库DLL 为提高代码复用性,实现模块化开发,我们通常会对一些常用函数进行封装,通过调用共享库库的方法实现,Qt自身便能构建共享库,本教程以构建动态链接库为例进行讲解。 1. Qt新建共享库工程 ...
  • 需要根据从外部读取类名来创建类的实例,类大多为qt自带的控件类,如QWidget,QLineEdit等。有没有不用继承这些类就可以动态创建的方法?
  • 本片文章主要是讲解Qt动态库的创建及其使用,创建一个实现加、减、乘、除功能的动态库,这里只实现加法功能。 开发环境:windows xp、Qt4.8、MinGW32 2、程序文件列表: 2.1、动态库文件列表: 2.2、调用...
  • 这样写:QWidget *w = new QWidget[n]; 经常会在程序结束时回收资源时发生错误。 所以应该一个一个来定义: for(int i = 0; i ; ++i){ QWidget *w = new QWidget(parent); } 或者: ... i < n
  • Qml动态创建对象有两种方式: a.使用Loader b.使用javaScript 1.Loader加载机制: 加载过程: 通过source,来加载qml文件。 通过sourceComponent,来加载Component组件。 销毁过程: source="" sourceComponent=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,745
精华内容 8,698
关键字:

qt动态创建