The Book of Qt 4 翻译:3.3-3.5 界面设计和资源编辑
The Book of QT4 翻译
QT程序设计艺术
---------------------------------------------------------------------------------
原名:The Book of QT 4:The Art of Building Qt Applications
译名:The Book of QT 4中文版:QT程序设计艺术
---------------------------------------------------------------------------------
第三章 使用Qt设计器进行界面设计
3.3 自动信号-槽连接
熟悉Visual Basic或者Delphi的开发者初次接触Qt/C++开发时会发现信号-槽原理很难理解,而且他们看不到事件处理器。Qt 4允许他们保留他们习惯的语义,允许这种形式的槽声明:
void on_objectname_signalname();
它们被转换成connect()指令,然后由uic保存在setupUi()里面。顺便提一下,这个命名约定增强了源文件的可读性。
这个函数功能性的关键是静态函数QMetaObject::connectSlotsByName()方法:它需要一个指向一个QObject对象的指针,通过它寻找与名字一致的槽。然后QMetaObject::connectSlotsByName()方法将找到的槽与合适的信号连接。为了做到这一点,它使用了元对象编译器moc生成的元对象的信息。元对象以内省(在Java中被称作反射)的方式使C++获得了理解所有继承自QObject的类的能力。因此,在运行时类“知道”它自己的方法,信号和槽。connectSlotsByName()方法在指针指向的对象和它们的子对象的名字中递归查找,并将各自的信号与它们连接。
只有和Qt设计器生成的类一起使用时,奇趣才推荐上面展示的语义。在这个例子中,因为对象的名字与uic生成的指针指向的部件的名字一致,而且setupUi()会接着调用connectSlotsByName()方法。但是对于那些发现这种一致的命名模式不可抗拒的人来说,所有相关的对象都必须通过setObjectName()指派一个名字,都必须在构造函数或者外部调用QMetaObject::connectSlotsByName()方法,而且必须传递一个指向当前类的指针给这个函数。
// autoconnect/byteconverterdialog.h
...
private slots:
void on_decEdit_textChanged(const QString&);
void on_hexEdit_textChanged(const QString&);
void on_binEdit_textChanged(const QString&);
...
// autoconnect/byteconverterdialog.cpp
...
ByteConverterDialog::ByteConverterDialog(QWidget * parent)
: QDialog(parent)
{
setupUi(this);
}
void ByteConverterDialog::on_decEdit_textChanged(const QString& newValue)
{
bool ok;
int num = newValue.toInt(&ok);
if (ok) {
hexEdit->setText(QString::number(num, 16));
binEdit->setText(QString::number(num, 2));
} else {
hexEdit->setText("");
binEdit->setText("");
}
}
由于上面展示的语义很容易导致错误,仅当以多重继承的方式处理设计器生成的部件时,你才应该使用自动连接。
下面我们修改上面的例子,使槽的名字遵循自动连接的约定。同时构造函数中不再需要调用connect(),因此只留下setupUi()的声明。
3.4 在设计器中包含继承的类
有时候必须对Qt的标准窗口部件做必要的微调。在那种情况下,如果你没有注册一个新的自定义部件(这需要很大的工作量),就不能再使用Qt设计器。
如果还想在设计器中使用那样的部件,你可以在设计器中选择它的Qt基础部件,当完成调整后在部件上面点右键。在上下文菜单中,选择提升为自定义部件条目。在弹出的对话款中(如图3.13所示),你要指定新类和它的头文件的名字。尽管设计器继续显示原来的部件,完成后的程序使用的是修改过的部件;因此在实现中,你获得了一个指向继承的这种类型的部件对象的指针。
图3.13:得益于部件提升功能,在设计器中使用继承的类非常简单。它通常是你需要的。

要取消提升,在同样的位置的上下文菜单中选择取消提升条目就可以了。
然而,对于更复杂的调整,例如对布局行为的基础性改变或者添加额外的属性,这个方法不适合,因此设计器不考虑它们。
3.5 资源编辑器
从Qt 4.1版开始,设计器支持设置和管理第57页已经提到过的资源。集成在设计器中的编辑器可以从菜单工具--资源编辑器调用(译者注:Qt 4.6.2中有变化,要先从视图中选择资源浏览器,然后在右边的资源浏览器中选择编辑资源),假如它没有显示出来。然而,在资源编辑器里定位需要一些时间习惯。在新建和打开条目后面的拖放工具箱显示的是已经打开的资源文件。它不包含保存动作,因为这个行为由编辑器执行。
图3.1.4:设计器的资源编辑器中的第57页的例子

此外,设计器中显示的资源列表独立于工程文件中的资源文件。这就是为什么很重要的一点是要确保所有实际的资源都要添加到RESOURCES变量。通过随后运行qmake,资源成为工程的一部分。
例如,在设计器中,要从资源文件中给一个QLabel指定一个图片,你首先要在属性编辑器争那个寻找pixmap属性并点击那里的文件夹图标。在弹出的对话框中选择指定一个资源你就可以打开资源编辑器,哪里你可以选择一个图片。为了以当前部件的大小显示图片,属性编辑器中的scaledContents必须被设置为true;否则图片仍将保持原始的大小。
出处:http://mcxiaoke.cnblogs.com/
转载:原创翻译,欢迎转载,不得用于商业目的,必须保留本文的署名 (包含链接).