KEEP K.I.S.S.

tk's blog

Qt 之 Layout

直接贴 Qt 帮助里的原话吧

 

Tips for Using Layouts

When you use a layout, you do not need to pass a parent when constructing the child widgets. The layout will automatically reparent the widgets (using QWidget::setParent()) so that they are children of the widget on which the layout is installed.

Note: Widgets in a layout are children of the widget on which the layout is installed, not of the layout itself. Widgets can only have other widgets as parent, not layouts.

You can nest layouts using addLayout() on a layout; the inner layout then becomes a child of the layout it is inserted into.

QLayout 会负责将每个在 QLayout 中布局的 QWidget 对象 和 QLayout 本身所在的父 QWidget 对象进行“连接”,也就是将这些布局对象转变为本身坐在的父 QWidget 对象的孩子,由它来负责各个布局子对象的生存期管理。 容易错误以为 QLayout 会是这些布局对象的父母,但是事实上它们之间应该是兄弟关系,QLayout 只负责将这些布局对象跟其父母进行连接而已。

KDE下Qt程序字体问题

 

弄了几天的问题,终于算是部分解决了。

问题是这样的,在KDE下,并不是所有程序的字体都和KDE设置的是一样的,就连基于Qt的程序也是如此。之前下载了 Qt SDK 1.1.3,自带的Qt Creator 的字体看上去太蛋疼了,模糊,又不好看,怎么设置也没办法弄。

后来在网上找了很多方法,qtconfig 也试过,没有效果,有人质疑 Qt 程序的字体设置和 KDE 默认的冲突,但是也没有找到解决方法。

没办法,最后找到了一个设置微软雅黑字体的办法来试试,结果还是不错的。

在用户目录下有个字体设置文件, .fonts.conf ,就是修改这个文件来修改全局字体。如下所附带的就是一个用于微软雅黑显示所用的代码。其实不知道还有没有更好的办法,因为这样设置后Chrome里的字体也全部微软雅黑了。。。。。。 等学会了 这个文件的原理就能找到好方法了吧。。

 

================= 9/22 更新 ==============

新配置文件,完全去除windows宋体,建议不使用该字体。新配置文件为 /etc/fonts/local.conf 没有可以新建。

 

<?xml version='1.0'?>
<fontconfig>
 <!--
# 设置 serif 衬线字体的读取顺序
-->
 <alias>
  <family>serif</family>
  <prefer>
        <family>Bitstream Vera Serif</family>
   <family>Microsoft YaHei</family>
  </prefer>
 </alias>
 <!--
# 设置 sans-serif 无衬线字体的读取顺序
-->
 <alias>
  <family>sans-serif</family>
  <prefer>
        <family>Bitstream Vera Sans</family>
   <family>Microsoft YaHei</family>
  </prefer>
 </alias>
 <!--
# 设置 monospace 等宽字体的读取顺序
-->
 <alias>
  <family>monospace</family>
  <prefer>
          <family>Bitstream Vera Sans Mono</family>
      <family>Microsoft YaHei</family>
  </prefer>
 </alias>
 <!--
# 全局字体的设置
-->
 <match target="font">
  <test compare="contains" name="family">
   <string>Tahoma</string>
   <string>verdana</string>
   <string>Arial</string>
   <string>Times New Roman</string>
  </test>
  <edit name="globaladvance">
   <bool>false</bool>
  </edit>
  <edit name="spacing">
   <int>0</int>
  </edit>
  <edit mode="assign" name="hinting">
   <bool>true</bool>
  </edit>
  <edit mode="assign" name="autohint">
   <bool>false</bool>
  </edit>
  <edit mode="assign" name="antialias">
   <bool>true</bool>
  </edit>
  <edit mode="assign" name="hintstyle">
   <const>hintfull</const>
  </edit>
 </match>
 <!--
# 单独设置微软雅黑字体的显示
-->
 <match target="font">
<test name="family" compare="contains">
<string>Microsoft YaHei</string>
<string>微软雅黑</string>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
<edit name="hintstyle" mode="assign" >
<const>hintfull</const>
</edit>
</match>
<!--
# 单独设置 Bitstream Vera Sans 字体的显示
-->
<match target="font">
<test name="family" compare="contains">
<string>Bitstream Vera Sans</string>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
<edit name="hintstyle" mode="assign" >
<const>hintslight</const>
</edit>
</match>
<!--
# 单独设置 Bitstream Vera Serif 字体的显示
-->
<match target="font">
<test name="family" compare="contains">
<string>Bitstream Vera Serif</string>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
<edit name="hintstyle" mode="assign" >
<const>hintslight</const>
</edit>
</match>

<!--
# 单独设置 Bitstream Vera Sans Mono 字体的显示
-->
<match target="font">
<test name="family" compare="contains">
<string>Bitstream Vera Sans Mono</string>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
<edit name="hintstyle" mode="assign" >
<const>hintslight</const>
</edit>
</match>
</fontconfig>

指针也许比引用更好~。~

 

        这是Qt开发者网站的一片文章的节选,讲述API的设计原则的,里面有一段关于C++中需要修改实参的函数的参数是选择指针还是引用的区别。然后,Qt里面选择了指针。因为调用这种函数的时候可以让人一眼看出这个函数调用会修改实参的值。

原文章:http://developer.qt.nokia.com/wiki/API_Design_Principles

C++ Specifics

Value vs. Object

Pointers vs. References

Which is best for out-parameters, pointers or references?

 

void getHsv(int *h, int *s, int *v) const
void getHsv(int &h, int &s, int &v) const

Most C++ books recommend references whenever possible, according to the general perception that references are “safer and nicer” than pointers. In contrast, we at Qt Software tend to prefer pointers because they make the user code more readable. Compare:

 

color.getHsv(&h, &s, &v);
color.getHsv(h, s, v);

Only the first line makes it clear that there’s a high probability that h, s, and v will be modified by the function call.

 

如何使用Qt Creator 开发普通C++项目

相信很多人有这样的需求吧

推荐使用 Qt Creator 2.1 以上版本,因为自带了 Class View ,不需要第三方的插件就可以看Symbol了。

新建项目里,选择 Other Project 然后是 Import Existing Project,建立项目后添加文件,最后需要的是自己写一个 Makefile, 而且默认的 Build 目标是 all,注意 GNU make 的文件格式,命令行开头需要一个完整的 TAB

针对最简单的单文件,比如 main.cpp ,makefile 可以这样写

 

all:
	g++ -o  main main.cpp          

然后就可以了。

如果你自己添加的第三方库也可以提供自动补全功能,但是需要能搜索到这个库目录,我用的是 Mingw ,直接把第三方库放到 Mingw 对应的 include 和 lib 目录了,引用头文件之后自动补全很好很强大。应该也有环境变量来设置的,不过暂时不大清楚如何操作。

Qt Creator 2.1.0

之前一直都是直接下 Qt windows sdk 集成开发环境,这个最新的是带着 Qt 4.7.0 和 Qt Cretor 2.0.1。

最新的Qt 库是4.7.2,Qt Cretor 是 2.1.0,但是没有提供组合的 sdk集成环境包下载。

新的 2.1.0的Qt Creator 更新比较大,界面支持全中文显示,插件也有新的,支持类视图浏览了,不用再单独去下第三方的cppsupport了,代码显示上也有更新,我发现的就是虚函数显示会是斜体,具体应该是高亮显示更加细化了。

Qt Creator 真是越用越好用了。