读Qt例子-designer_calculatorbuilder笔记

 

读qt例子-designer/calculatorbuilder笔记:

 

Qt版本:4.7.0

 

此例子通过在程序中动态加载ui文件的方式实现一个简单的加法计算器;

首先通过designer设计好加法计算器的界面,然后在代码中使用QUiLoader动态加载此ui文件,最后使用

 

void QMetaObject::connectSlotsByName ( QObject * object ) [static]

 

将object的所有子对象的信号和槽连接起来,这些需要链接的槽遵从如下格式:

 void on_<object name>_<signal name>(<signal parameters>);

例如:

 void on_button1_clicked();

槽函数需要自己实现,例如:

void CalculatorForm::on_inputSpinBox1_valueChanged(int value)

{

    ui_outputWidget->setText(QString::number(value + ui_inputSpinBox2->value()));

}

 

若干知识点:

 

QUiLoader:

能够在程序运行中对单个应用程序动态的创建用户界面,这些界面信息预先存储在UI文件或者在插件路径中指定。

另外,也可通过获得你自己的加载类来自定义或创建用户界面。

如果你有一个嵌入了Qt Designer的自定义组件或应用程序,也可以通过UI文件使用QFormBuilder类创建用户界面,这个类由QtDesigner模块提供。

QUiLoader类提供一个函数集,允许基于存储在UI文件中或者插件路径中指定的信息创建构件,UI文件可以通过Qt Designer创建。指定的插件路径可通过pluginPaths()检索。类似的,UI文件的内容可使用load()检索。例如:

MyWidget::MyWidget(QWidget *parent)

     : QWidget(parent)

 {

     QUiLoader loader;

     QFile file(":/forms/myform.ui");

     file.open(QFile::ReadOnly);

     QWidget *myWidget = loader.load(&file, this);

     file.close();

 

     QVBoxLayout *layout = new QVBoxLayout;

     layout->addWidget(myWidget);

     setLayout(layout);

 }

 

通过在窗口资源文件(myform.qrc)中包含用户接口文件,以确保程序运行时能够找到要动态加载的UI文件:

 <!DOCTYPE RCC><RCC version="1.0">

 <qresource prefix="/forms">

 <file>myform.ui</file>

 </qresource>

 </RCC>

 

availableWidgets()返回一个字符串列表,这个列表表示在指定的插件路径中所有可用的构件类名。可在程序中使用createWidget()创建这些构件。例如:

QWidget *loadCustomWidget(QWidget *parent)

 {

     QUiLoader loader;

     QWidget *myWidget;

 

     QStringList availableWidgets = loader.availableWidgets();

 

     if (availableWidgets.contains("AnalogClock"))

         myWidget = loader.createWidget("AnalogClock", parent);

 

     return myWidget;

 }

如果要让加载器能够使用自定义构件,可通过addPluginPath()添加构件路径;要删掉所有可用构件,只需调用clearPluginPaths()。

对于函数 createAction(), createActionGroup(), createLayout(), 和 createWidget() ,它们被QUiLoader内部使用,当需要单独创建一个action, action group, layout, 或者widget。如果需要,也可以子类化QUiLoader同时重新实现这些类,加入到构件用户界面类的进程中。例如,也许你在加载一个form或创建自定义构件时,有一个action的列表想被创建。

 

QT_BEGIN_NAMESPACE

class QLabel;

class QSpinBox;

QT_END_NAMESPACE

当头文件中只需要使用QLabel的指针类型时,可以通过这种方式而不需要在头文件中包含QLabel的头文件,减少了头文件中引入的头文件数量,可加快编译速度。降低各个文件编译时的关联度,不会在改动一下部分类而引发其他大量文件的重新编译,小工程没什么区别,对于大工程一编译好几个小时,优势就显现出来了。如果不是使用指针类型的声明,而是直接使用,例如QLabel label,还是需要包含头文件。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值