Jump to Navigation

Welcome!

  NullGet是使用Qt编写的,运行于多种平台的GUI界面的多线程多协议断点续传下载软件。  使用NullGet可以轻松下载网络的多种协议的数据流,加快下载速度,支持断点续传,目前支持的协议有:HTTP,HTTPS,FTP,MMS,RTSP。而且它能运行于当前大多数流行的操作系统,包括Windows,Linux,FreeBSD等。     下载NullGet

  NullFXP 是一个基于Qt 4 开发的SFTP/FTP 客户端软件。目前已经实现基本的多文件上下传功能。详细信息查看本站项目说明页面。     下载nullfxp

  我们的目标是打造一个开源的,跨平台的,多线程的,运行稳定的下载软件,另一个就是整理Qt库开发跨平台GUI应用程序的相关资料。欢迎各位朋友对本站开源项目提供意见及建议,欢迎有兴趣的朋友参与本站开源项目,请联系 drswinghead at gmail dot com

使用QImage的高质量渲染

       在绘图的时候,我们可能要面对速度和精确的平衡。例如,在X11和Max OS X上,在QWidget或者Qpixmap上绘图依赖于平台的本地绘图引擎。在X11上,要保证与X服务器的通信最少,仅有绘图命令被传递而不是实现的图象数据。这种方法的主要缺点是Qt受平台的本地支持所限制:
在X11平台上,你抗钜齿功能和小型坐标支持仅当X服务器上有Xrender 扩展才可用。
       在 Mac OS X平台上,本地别名图形引擎使用与X11和Windows平台不同的绘制多边形的算法,因而也就有稍微不同的结果。
       当精确比效率更重时,我们可以向一个QImage上绘图并把结果拷贝到屏幕上。这总是使用Qt自己的内部绘图引擎,在所有的平台都能给出一致的结果。唯一的限制是我们要绘制的QImage必须在创建的时候给出QImage::Format_RGB32或者QImage::Format_ARGB32_Premultiplied。

Category:

绘图器变换

       对QPainter的默认坐标系统,点(0,0)位于绘图设备左上角,x坐标向右增长,y坐标向下增长。每个象素占据默认坐标系统中大小为1x1的区域。
       要明白的一个重要事件是一个象素的中心位于“半象素”的地方。例如,左上角象素覆盖的区域在点(0,0)和(1,1)之间,它的中心位于(0.5,0.5)。如果我们要QPainter在(100,100)处画一个象素,它将通过在两个方向平移+0.5个象素把结果进行近似取值,这将导致该点中心被画在(100.5,100.5)。
       这个区别看上去首选是理论上的,但它在实际中也非常重要。首先,平移+0.5仅发生在抗钜齿功能被禁用时(默认是这样的),如果抗钜齿功能是激活的并且我们试图在位置为(100,100)的地方画一个黑色象素,QPainter将把(99.5, 99.5), (99.5, 100.5), (100.5, 99.5), 和 (100.5, 100.5)四个象素将被设置浅灰色,以制造一种象素正好位于四个点汇合处理的假象。如果这种影响是不期望的,我们可以通过指定半象素坐标来避免,如,(100.5, 100.5)。

Category:

使用QPainter进行绘图

       要开始向一个绘图设备上绘图(一般是一个物件),我们仅需要简单地创建一个QPainter并传递一个指向该设备的指针。例如:

Category:

第8章 2D和3D图象

  • 使用QPainter进行绘图
  • 绘图器变换
  • 使用QImage的质量渲染
  • 打印
  • OpenGL图象
  •        Qt的2D图象引擎是基于QPainter类的。QPainter可绘制几何形状(点,线,矩形,椭圆,弧,弦,饼图,多边形,和贝赛尔曲线),还有pixmap,图象和文本。此外,QPainter还支持许多高级功能如抗钜齿(对文本或者图形边缘),alpha混合,坡度填充工矢量路径。QPainter还支持变换,它使得绘制分辨率独立的2D图象成为可能。
           QPainter可用于在一个“绘图设备“绘图,如QWidget,Qpixmap或者QImage。它在我们编写带有自己的外观的自定义物件或者自定义项类时非常有用。QPainter还能用于连接Qprinter执行打印和生成PDF文档。这意味着我们能经常使用相同的代码在屏幕上显示数据和生成打印报告。
           QPainter的另一选择是使用OpenGL。OpenGL是一种绘制2D和3D图象的标准库。Qt 的OpenGL模块使得把OpenGL整合到Qt程序中变得非常容易。

    Category:

    在密集处理过程中保持响应

           当我们调用QApplication::exec()时,我们就启动了Qt的事件循环。Qt在启动的时候抛出几个显示以及绘制物件的事件。在这之后,事件循环就不停运行,不断地检查中否有什么事件发生并把这些事件分发到程序的QObject。
           当一个事件正在处理过程中,其他事件可能产生并追加到Qt的事件队列中。如果我们花费太多的时间处理特定的事件,用户界面可能会变得无法响应。例如,在程序把文件保存到磁盘上时任何窗口系统生成的事件将不能被处理,直到该文件保存完成。在保存过程中,程序不能响应窗口系统的请求来重绘它自己。
           一种解决方法是使用多线程:一个用于程序的用户界面的线程和另一个用于执行保存(或者任何其他耗时的操作)的线程。这样,程序的用户界面在保存文件的过程中依旧能保持响应。我们将在第18章中看如何实现它。
           一种的解决方法是在文件保存代码中频繁调用QApplication::processEvents()。该函数告诉Qt处理任何未决的事件,然后再把控制返回给调用者。实际上,QApplication::exec()只比一个在while循环中的processEvents()函数调用强一点。

    Category:

    安装事件过滤器

           Qt的事件模型的一个强大的功能是一个QObject实例能够在另一个QObject实例看到它的事件前监控它的事件。
           我们假设我们有一个给几个QLineEidt组成的CustomerInfoDialog物件,我们希望使用安全可靠键把焦点从一个移动到下一个QLineEdit上。这一非标准的行为可能对使用都经过良好训练的内部程序非常合适。一个直接的解决方法是创建QLineEdit的子类并重新实现keyPressEvent()来调用 docusNextChild(),代码如下所示:

    Category:

    重新实现事件处理器

          在Qt中,一个事件是继承自QEvent的对象。Qt处理了100多种事件,每一种通过一个枚举值标识。例如,对于鼠标按键事件QEvent::type()返回QEvent::MouseButtonPress。

          许多事件类型需要比存储在普通QEvent对象中更多的信息。例如,鼠标事件需要存储是哪个按键触发的事件,以及在事件发现时鼠标的位置在哪。这些附加的信息被存储在专门的QEvent的子类中,如 QMouseEvent。

          事件通过他们的从 QObject继承来的event()函数通知给其他对象。在QWidget中的event()实现传递了大多数普通类型的事件给特定的事件处理器,如mousePressEvent(), keyPress-Event(), 和 paintEvent()。

          在前面章节中实现MainWindow, IconEditor, 和 Plotter的时候,我们已经见过了许多事件处理器。在QEvent的参考手册中还列出了许多其他类型的事件,还可以创建自定义事件并自己分发这些事件。这里,我们将预览一个两个值得说明的常见事件:键盘事件和计时器事件。

    Category:

    第7章 事件处理

  • 重新实现事件处理器
  • 安装事件过滤器
  • 在集中处理过程中保持响应
  •     事件是由窗口系统或者Qt自己产生以响应不同事件。当用户按下或者翻译一个键盘键或者鼠标键时,一个键盘或者鼠标事件被生成。当窗口首次显示时,一个绘图事件被生成认告诉新的可见窗口它需要重绘自己。大多数事件被生成以响应用户的行为,但也有些,像计时器事件,是由系统独立生成的。
    当我们使用Qt编程的时候,我们几乎不需要考虑事件,因为当标志性事件发生时,Qt的物件会发射信号。当我们编写自定义物件或者我们想修改现有Qt物件的行为时事件变得非常有用。

        事件应该不会与信号冲突。有一个规则是:在使用物件的时候信号比较有用,而在实现物件的时候事件比较有用。例如,当我们使用QPushButton的时候,我们对它的clicked()信号更感兴趣而不是导致信号被发射的底层的鼠标或者键盘事件。但是如果我们在实现一个像QPushButton的类,我们就需要编写处理鼠标和键盘事件的代码并在必要的时候发射clicked()信号。

    Category:

    Vim 7.2编辑器发布

    Vim团队宣布,经过15个月的努力工作,最新Vim稳定版7.2发布了。Vim7.2修正了大量bug并更新了运行时文件,最主要的新特性在于加入对脚本浮点数的支持。另外,修正了上一版中发现多个导致崩溃和威胁安全的问题。关于此次更新的详细信息在安装完成后可以使用 ":help version-7.2"命令查看。

    Category:

    nullfxp中两个远程服务器间文件拷贝的另一方法

    目前实现的方法是在客户端同时连接到两个服务器,数据需要通过本地客户端中转

    这种方法的数据传递效率不高。

    图示:对于丙个服务器A、B,当前要从A上传递文件到B服务器上,客户端为C

    A---->C----->B

    另一种方法说明:对于同一种情况。

    C
    |
    | 控制命令
    |
    V
    A----->B

    客户端C控制数据源A,让其连接到B,并将文件传到B服务器上。

    这种方法的优点数据不需要中转,传输速度会变快。

    缺点是,C对A的控制复杂,对于可能出现的情况不好控制,并且有些服务器只开SFTP而没有SSH命令执行功能。

    Category:

    页面

    订阅 www.qtchina.tk RSS


    Main menu 2

    by Dr. Radut