• 要保存位置,只要在组件退出时记录下组件的几何属性,在组件创建时读入就可以了.
    我借用kdevelop自己生成的Qt单文档程序实现了这个功能,具体操作如下:

    1.重载RecordPosApp类的closeEvent虚函数.
    protected:
    virtual void closeEvent(QCloseEvent* e);

    2.实现closeEvent函数.
    void RecordPosApp::closeEvent(QCloseEvent* e)
    {
    //创建文件
    QFile f("Pos.txt");
    if ( !f.open( IO_WriteOnly) )
    return;

    QTextStream t( &f );
    QString strPos[4];

    //记录组件的几何坐标
    strPos[0].setNum(this->x());
    strPos[1].setNum(this->y());
    strPos[2].setNum(this->width());
    strPos[3].setNum(this->height());

    //将组件的几何坐标写入文件
    t <<strPos[0]<< "\n";
    t <<strPos[1]<< "\n";
    t <<strPos[2]<< "\n";
    t <<strPos[3]<< "\n";
    f.close();

    //退出整个程序
    qApp->quit();
    }
    到这里,记录部分就写完了.下面是读入部分.

    3.读入组件的几何位置.
    这段代码书写具体函数不限,只要被RecordPosApp的构造函数调用的就可以了,我写在了
    RecordPosApp::initView()中.
    具体如下:
    void RecordPosApp::initView()
    {
    ////////////////////////////////////////////////////////////////////
    // set the main widget here
    view=new RecordPosView(this, doc);
    setCentralWidget(view);//这里以上是原有的代码

    //打开文件
    QFile f("Pos.txt");
    if ( !f.open( IO_ReadOnly ) )//打不开的话不进行操作
    return;

    QTextStream t( &f );
    QString strPos[4];

    //从文件中读入位置的值放入字符数组
    strPos[0]=t.readLine();
    strPos[1]=t.readLine();
    strPos[2]=t.readLine();
    strPos[3]=t.readLine();

    //设置本组件的几何位置
    this->setGeometry(
    strPos[0].toInt(),//x
    strPos[1].toInt(),//y
    strPos[2].toInt(),//width
    strPos[3].toInt());//height


    f.close();

    }
    这样,在程序开启时就被重新设置了一次几何位置了.

    junglesong 原创
    2004-3-17AM
  • 在Qt中进行绘图操作的时候我们常常需要对位图进行缩放,利用QWMatrix类 就可以很轻松的完成此功能,示例代码如下:
    QPixmap pm ;

    // do something to pm

    if ( !pm.isNull() )
    {
    QWMatrix m;//创建一个QWMatrix类的对象
    m.scale(0.5f, 0.5f);//设立一个进行缩小到1/2的变换矩阵
    pm = pm.xForm(m);//进行变换操作
    }

    大家有兴趣可以自己尝试一下.

    junglesong 编辑
    2004-1-26
  • 首先,要想把闪烁减弱,请设置组件的背景模式为NoBackground.
    setBackgroundMode(NoBackground);

    其次,重载组件的paintEvent()函数,如下改写:
    void MyWidget::paintEvent(QPaintEvent *e)
    {
    QRect ur=e->rect();//得到组件尺寸
    QPixmap pix(ur.size());//以此为参数创建一个位图变量
    pix.fill(this,ur.topLeft());//填充位图
    QPainter p(&pic);//以位图为参数创建一个QPainter 对象

    p.translate(-ur.x(),-ur.y());//在QPainter 上绘画
    //......//Drawing

    p.End();//绘画完毕

    bitBlt(this,ur.topLeft().&pix);//把位图贴到组件上
    }


    junglesong 整理
    2004-1-24
  • 在Qt中创建无边框窗口

    首先要设置窗体组件的Wflags是WstyleNoBorder, 无边框窗口要求对整个窗口使用图像掩码.具体方法如下:

    设置Qpixmap类型成员变量m_pixmapBack;

    在构造函数中书写:

    m_pixmapBack.load(“bg.bmp”);
    Qbitmap bitmaptmp(“bg.bmp”);//作为掩码的位图,白色部分透明,黑色部分保留.
    setMask(bitmaptmp);
    setBackgroundPixmap(m_pixmapBack);


    junglesong 编辑整理
    2004-1-21
  • 在Qt程序窗口上点击任意区域移动窗体

    方法是截取组件Widget的鼠标事件函数,自己处理鼠标点击和移动的事件.

    Void MyWidget::mouseMoveEvent(QmouseEvent *e)
    {
    Qpoint newpos=e->globalPos();//获得鼠标相对于屏幕坐标系的位置
    Qpooint upLeft=pos0+newpos-last;
    Move(upLeft);
    }

    Void MyWidget::mousePressEvent(QmouseEvent *e)
    {
    last=e->globalPos();//获得鼠标相对于屏幕坐标系的位置
    pos0= e->globalPos()-e->pos();
    }

    解释:
    e->globalPos(); //获得鼠标相对于屏幕坐标系的位置
    e->pos(); //鼠标相对于窗体左上角的位置
    pos0; //窗体左上角的位置
    upLeft; //新的窗体左上角的位置

    这里,我们取得的鼠标位置是绝对位置,即相当于窗口的位置,同时也记录下窗体左上角的位置,当鼠标移动时,取得新的绝对位置,则窗口做上角的新位置应该时原来位置与鼠标移动的位置之差.

    Junglesong 编辑整理
    2004-1-21
  • 1. 如何在Qt程序中加入OpenGL支持。
    在QT程序中加入OpenGL支持很简单,只需要在Kdevelop连接的库中加入“-lGL -lGLU”即可,如果需要glut支持,还可以加入“-lglut”。具体操作是在kdevelop集成编译环境中按下”F7”,在弹出的对话框中选择“Linker”一项,在输入栏输入你想添加的库即可,写法与gcc/g++一致。
    一般在类QGLWidget中使用OpenGL,调用此类的头文件是qgl.h,具体写法请参考qt例程中的gear,texture,box等程序(在RedHat7.2中,它们在/usr/lib/qt-2.3.1/doc/examples下).

    2. 检验linux/Unix环境是否支持OpenGL.
    Qt中的QGLFormat类可以帮助我们轻易检验系统是否支持OpenGL,载入头文件(#include <qgl.h>)后,我们就可以使用QGLFormat的静态函数hasOpenGL来检验,具体写法如下例:
    if (!QGLFormat::hasOpenGL()) //Test OpenGL Environment
    {
    qWarning( "This system has no OpenGL support. Exiting." );//弹出警告对话框
    return -1;
    }

    3.获得屏幕的高和宽.
    一般我们可以通过QT的Qapplication类来获得系统的一些信息,载入头文件(#include <qapplication.h>)我们就可以调用它,下例是使主程序充满整个屏幕的代码:
    Gui_MainForm gui_mainform;
    a.setMainWidget( &gui_mainform );
    gui_mainform.resize( QApplication::desktop()->width(), QApplication::desktop()->height() ); gui_mainform.show();

    4.关于信号和槽.
    信号和槽机制是QT库的重要特性,可以说不了解它就不了解Qt.此机制能在各类间建立方便快捷的通信联系,只要类中加载了Q_OBJECT宏并用connect函数正确连接在一起即可,具体写法这里就不赘述了.但本人在使用过程中发现使用此机制容易破坏程序的结构性和封装性,速度也不是很让人满意,尤其是在跨多类调用时.鄙人的一孔之见是: 信号和槽机制不可不用,但不可多用.

    5.QT程序中界面的设计.
    尽管Kdevelop是一个优秀的集成编译环境,可遗憾的是它不是一个可视化的编译环境,好在有Qdesigner来帮助我们完成界面设计,该程序的使用很简单,使用过VB,VC和Delphi的程序员能很快其操作方式,操作完成后存盘会生成一个扩展名为”ui”的文件,你接下来的任务就是把它解析成cpp和h文件,假设文件名为myform.ui,解析方法如下:
    $uic myform.ui –I myform.h –o myform..cpp //这句生成cpp文件
    $uic myform.ui –o myform.h //这句生成h文件.

    6.由pro文件生成Makefile.
    对于Linux/Unix程序员来说编写Makefile文件是一项令人烦恼的任务,而qt程序员就没有这样的烦恼,一句$qmake –o Makefile myprogram.pro就可以轻松愉快的完成任务,而pro文件的编写也很容易,其核心是h和cpp文件的简单列表.具体写法请参考一下qt自带的样例和教程吧(在RedHat7.2中,它在/usr/lib/qt-2.3.1/doc/examples下),相对Makefile文件简直没有什么难度.

    7.主组件的选择.
    一般我们在编程是使用继承Qwidget类的类作为主组件,这当然未可厚非.但在制作典型的多文档和单文档程序时我们有更好的选择—QmainWindow类,它可以方便的管理其中的菜单工具条主窗口和状态条等,在窗体几何属性发生变化时也能完美的实现内部组件缩放,这比用传统的几何布局类来管理要方便得多,而且不用写什么代码.关于它的具体细节请查阅QT的帮组文档,这里就不赘述了.

    8.菜单项中加入Checked项.
    在QT中,菜单项中加入Checked有点麻烦,具体写法如下:
    1> 定义int型成员变量,并在创建菜单项中写:
    displayGeometryMode=new QPopupMenu(this); //这里创建弹出菜单组displayGeometryMode
    m_menuIDWire=displayGeometryMode->insertItem("Wire",this,SLOT(slt_Change2WireMode()));.//创建弹出菜单子项
    displayGeometryMode->setItemChecked(m_ menuIDWire,true);//设定此子项为选择状态

    2> 再在槽函数中写:
    displayGeometryMode->setItemChecked(m_menuIDWire,false);//这里设定此子项为非选择状态

    9.截获程序即将退出的信号.
    有些时候我们需要在程序即将退出时进行一些处理,如保存文件等等.如何截获程序退出的信号呢?还是要用到Qapplication类的aboutToQuit()信号,程序中可以这样写:
    connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(Slot_SaveActions()));
    在槽函数Slot_SaveActions()就可以进行相关处理了,注意,使用全局对象qApp需要加载头文件(#include <qapplication.h>).

    10.弹出标准文件对话框.
    在程序中弹出文件对话框是很容易处理的,举例如下:
    QString filter="Txt files(*.txt)\n" //设置文件过滤,缺省显示文本文件
    "All files(*)" ; //可选择显示所有文件
    QString Filepathname=QFileDialog::getOpenFileName(" ",filter,this);//弹出对话框,这句需要加载头文件(#include < qfiledialog.h >)


    11.将当前日期时间转化为标准Qstring.
    QDateTime currentdatetime =QDateTime::currentDateTime();//需要加载头文件(#include < qdatetime.h >)
    QString strDateTime=currentdatetime.toString();

    12.设置定时
  • 我先抛个砖,大家有玉赶紧扔出来。
    QT教程BIG5
    http://www.csdn.net/linux/document/programme/qt.zip ;
    一个台湾人写的QT说明文档,翻译自QT带的英文文档,不是很全面。

    http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?openview&count=1000 ;
    IBM的developworks网页,其中有一些linux三剑客之一于明俭写的一些关于qt的文章。

    http://www.qiliang.net/qt/ ;
    QT参考文档,也是翻译自QT带的英文文档,主要译者:Cavendish,功力不错,不过现在尚未翻译完毕,可以于上面的QT教程BIG5 交换阅读,如读者有兴趣也可参加此项目。

    Linux相关图书选购指南
    http://www.china-pub.com/main/linux/linux_fengrui.htm ;
    讲述了常见的linux书籍,当然也包括qt的。

    讨论使用QT编程的技术论坛。版主为软件小兵。
    http://vcqt.xilubbs.com/,同样可惜的也是人气不足。

    ---------------------------------------------------------------

    linuxforum.net
    上面高手多。不过问问题要注意方法,别问“stupid questions”
    ---------------------------------------------------------------


    http://www.trolltech.com/ ;
    QT老东家trolltech的网站


    http://www.linuxeden.com/forum/forumdisplay.php?s=603174be0b723bd123202a4a786c1022&forumid=61 ;
    linuxeden的rad编程论坛,关于kdevelop和kylix的多,一些在本版提出的问题在那里都有。

    http://www.chinaunix.net/cgi-bin/bbs/bbs.cgi ;
    永远的unix论坛,去的不多,不评论。


    http://www.chinaunix.net/cgi-bin/bbs/bbs.cgi ;
    永远的unix论坛,发贴量挺大。

    http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewforum&f=29&sid=7f0ea939d0331f4f1113986086be4155 ;
    中国linux公社的编程论坛。人气不错。


    http://lists.linux.net.cn/wws/info/qt-cn ;
    qt中文邮件列表

    Qt OpenGL教程,翻译进行中
    http://www.qiliang.net/nehe_qt,