读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,还是需要包含头文件。