QT3开发积累

来源:互联网 发布:石油化工基础数据手册 编辑:程序博客网 时间:2024/05/17 15:04

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;

}

原创粉丝点击