QT3开发积累 收藏
随做随总结,不断更新:
1. 支持中文
(1) 方法一
在main.cpp里加入下面编码:
#include <qtextcodec.h>
//使用中文编码
QTextCodec *tc = QTextCodec::codecForName("utf8");
QTextCodec::setCodecForCStrings(tc);
(2) 方法二
如果支持多语言,建议使用 QtLinguist(没实验过)
2. QPixmap的定义和赋值
(1) QPixmap pix;
pix.load("images/typebutton.PNG");
(2) QPixmap pix("images/typebutton.PNG");
(3) QPixmap pix = new QPixmap("images/typebutton.PNG");
3. 如何实现QT背景图片拉伸
(1) 方法一
int w = 10;
int h = 20;
QPixmap pix("test.png");
QImage qimage = pix.convertToImage();
qimage = qimage.scale(w, h, QImage::ScaleFree);
pix.convertFromImage(qimage, QPixmap::Auto);
(2) 方法二(貌似是4.0以上版本的,没验证过)
QWidget *widget = new QWidget();
widget->setAutoFillBackground(true); // 这句要加上, 否则可能显示不出背景图.
QPalette palette = widget->palette();
palette.setBrush(QPalette::Window,
QBrush(QPixmap("1.png").scaled( // 缩放背景图.
widget->size(),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation))); //使用平滑的缩放方式
widget->setPalette(palette); // 至此, 已给widget加上了背景图.
4. 对图片灰度的处理
QImage qimage = pix.convertToImage();
pix.convertFromImage(qimage, QPixmap::Mono);//黑白,而且颗粒感很强,不太好看
5. 背景图片按实际大小比例显示
首先,覆盖控件的paintEvent事件
然后,在事件处理时获得控件的实际大小
最后,按照上面的方法一拉伸背景图片,再覆盖原背景图片
代码如下:
//m_pmBackGroundPixmap是要显示的背景图片(QPixmap)
//m_lbPixLabel是自定义label控件(QLabel)
//getStretchPixmap(int w, int h, QPixmap pix)是按照6方法写的公共函数
void BPixmapButtonBase::paintEvent( QPaintEvent *e)
{
QRect rect = e->rect();
m_pmBackGroundPixmap = getStretchPixmap(rect.width(), rect.height(), m_pmBackGroundPixmap);//
m_lbPixLabel->setBackgroundPixmap(m_pmBackGroundPixmap);
}
6. emit的应用
用于对象之间的信号传递。尤其是下级向上级,平级之间。轻而易举地将控件和控件联系起来了,并可以传递参数。
具体使用方法:
在头文件里定义信号(a.h):
signals:
void typeBtnClicked(int);
在cpp文件里的某个时候触发(a.cpp):
emit typeBtnClicked(1);
在调用类头文件定义相应slot(b.h):
public slots:
void resetDishPage(int);
在调用处建立连接,捕获信号(b.cpp):
A a = new A();
connect(a, SIGNAL(typeBtnClicked(int)), this, SLOT(resetDishPage(int)));
定义响应槽:
void B::resetDishPage(int i)
{
//可以使用i值,也可以继续向上级释放信号
}
7. QString的使用相关:
(1) 给QString赋值
QString s = “sss”;
也可以:
s.sprintf(“sss %d”, 2);
(2) int怎么转换成QString
int i=0;
//静态函数的方法
QString s = QString::number(i, 10);//10表示10进制,也可以不写,默认就是10进制
//非静态函数的方法
QString::setNum ( ulong n, int base = 10 )
这两个函数同样使用于其他数字类型,如:uint, long, float, bouble等
(3) QString怎么转换成其它类型
若是int、float等数字型,有直接的对应转换函数。如:toInt(bool *ok=0, int base=10)等
QString s = "10";
int i = s.toInt();
若是char*型,则有:ascii()。如:
char *c = s.ascii();
(4) 怎么比较两个QString的内容
直接使用==,>=, <=,<,>,!=等。
8. 字体和颜色
在很多时候都会用到颜色,背景颜色、文字颜色等。qt的颜色设置很简单:直接用颜色的名字。如:
QLabel lb;
lb->setFont( QFont("Times", 10, QFont::Bold));//设置字体
lb->setPaletteBackgroundColor(white);//设置背景颜色
lb->setPaletteForegroundColor(white);//设置字体颜色
QPainter *p;
p->setBrush(red);
p->setPen(black);
当然也支持r,g,b的定义:
QColor(77, 00, 113);
或是用十六进制定义:
QColor("#4D0071");
9. 比较好的QT网络资源
国内的当然数:QT中文论坛了:http://www.qtcn.org/bbs/上面共享的资料,学习材料非常的不错。如果是初学者还是不错的地方
国外的要数:http://www.qtcentre.org如果有比较高深的问题可以上这个论坛,很多热心人哦。当然也有很多高手共享的源码
想系统学习还是官方的帮助文档(3.3版):http://doc.trolltech.com/3.3/index.html
10. setBackgroundPixmap() 和 setPalleteBackgroundPixmap()什么区别?
setBackgroundPixmap()是给自己的背景设置图片
setPalleteBackgroundPixmap()不但给自己设置背景图片,还设置了其pallete的背景也是这个,这样其子控件都跟着变化。
11. 密码框的实现
QLineEdit,将echoMode属性设置成:Password
这样,输入的字符都是圆点显示
12. 动态定义、弹出对话框
qt对话框类是QDialog ( QWidget * parent = 0, const char * name = 0, bool modal = FALSE, WFlags f = 0 )
modal:指是否模式对话框,也可以用setModal(bool)改变设置;
f:指窗口的样式。
如:
DDishDetailForm *dishDetailForm = new DDishDetailForm( this->parentWidget(), "dishdetailform", TRUE, WStyle_Customize | WStyle_NoBorder);
定义了一个DDishDetailForm的弹出窗口,模式对话框,无边框。
弹出对话框,可以用:
dishDetailForm->show();//显示的模式按照对应的为准
也可以用:
dishDetailForm->exec();//则无论定义的modal设置的是什么,都按照模式对话框显示
13. 遍历children
QList <QObject*> widgets=this->children();
QListIterator <QObject *> i(widgets);
while(i.hasNext())
{
QCheckBox mycheckbox=(QCheckBox*)i.next();
}
QWidget类的children()方法可以用来遍历children,但是返回的是QObject,有没有方法转换成checkbox?
QGridLayout的itemAtPosition()方法也可以遍历其中的item,同样的问题是,返回类型是QLayoutItem。
谢谢。
QObjectList *l = topLevelWidget()->queryList( "QButton" );
QObjectListIt it( *l ); // 遍历按钮
QObject *obj;
while ( (obj = it.current()) != 0 ) {
// 对于每一个找到的对象……
++it;
((QButton*)obj)->setEnabled( FALSE );
}
delete l; // 删除这个列表,而不是对象
14. 枚举的应用
(1) 定义和使用
enum DISH_VIEW_TYPE{OTHER=0, ICON_VIEW=5, LIST_VIEW=2, MENU_VIEW=3}
再定义元素的时候,可以指定元素对应的int数值;若不指定,第一个元素默认是0,其它元素不知道。
使用时,就像其它类型一样:
DISH_VIEW_TYPE tp = ICON_VIEW;
(2) enum和int类型的互换
enum可以直接赋值给int型:
int i = tp;
但是,int不能直接赋值给enum型,但可以强制转换:
int i = 0;
tp = (DISH_VIEW_TYPE)i; //对应OTHER
两个类型的比较是可以直接比较的:
if(i == tp)
{
some codes;
}
http://blog.csdn.net/wangjuns8/archive/2010/01/12/5182191.aspx