QT学习:窗体激活事件、处理跨平台差异、TextEdit的不同

站UI设计

  上一节我们做了获取剪贴板数据的功能。

  按照惯例,我们要在窗体每次激活时检查一下剪贴板,如果剪贴板内有网址,则自动粘贴上。而不是傻傻地等着用户去点击“粘贴”按钮。所以,我们要监听窗体的激活事件。

  我试了试给按钮添加点击事件办法,去用鼠标右键在窗体上点,但是槽事件中并没有直接提供这些功能。不过这难不倒我,上网搜。。。。。。

  结果是:要重载一下窗体的事件过滤函数,这个函数会在窗体有事件时去调用,我们在里面过滤我们需要响应的事件就行,办法如下:

  在mainwindow.h中添加声明:

  protected: bool eventFilter(QObject *o, QEvent *e);//事件过滤器然后在mainwindow.cpp中实现函数:

  bool MainWindow::eventFilter(QObject *watched, QEvent *event){ if( watched == this ) { //窗口激活事件,变为活动的窗口 if(QEvent::WindowActivate == event->type()) { echo("窗体被激活"); return true ; } else { return false ; } } return false ;}细心的条友应该看到那个echo了,这并不是标准函数,而是我写的一个函数,它的功能是向我界面中的TextEdit中添加数据,它的代码如下:

  void MainWindow::echo(QString str){ ui->te_Content->app(str);} 以往在BCB、C#、Java中,这样做是肯定有问题的,那就是输出的字符不会换行,会一直接在最后一行的末尾进行增长。必须得手动地加上回车换行。

  而我在QT中没加,它却是正常的,每次增加的字符串都会新起一行,这就有点意思了。我还说找找怎样处理跨平台换行呢(WIN是\r\n,其它平台是\r)。

  而要在QT中实现不新建一行,而是在最后一行不断加长的效果,要这样做:

  QString str = "老赵和他的"; ui->textEdit->moveCursor(QTextCursor::End); ui->textEdit->insertPlainText(str);//在读写指针的位置处插入此方式追加是不换行追加(moveCursor 将读写指针移动到末尾),是不是很神奇。

  但我不能这样堕落下去,万一其它地方要使用处理跨平台的功能呢?

  经过我的搜索:Qt并没有处理跨平台的回车换行或者是其它功能的办法。它不像JAVA一样有专门的常量,会根据不同平台进行来匹配不同的输出。

  这就不好玩了,可能是由于JAVA是一次编译到处运行,而QT是一次编写到处编译,机制不同的原因。

  但经过研究(搜索),有个笨办法来实现:

  在*.pro文件中,添加如下的宏定义:

  DEFINES +=windows然后我们在代码里可以这样写条件编译语句:

  //Windows系统包含头文件名不区分大小写,但是Linux系统包含头文件名区分大小写,故采用条件编译#ifdef windows QString newLineChar = "\r\n"#else QString newLineChar = "\r"#if//使用时cout << "这是一行" << newLineChar << "这又是一行";这样当.pro文件中宏定义为windows的时候,换行符就是\r\n,改为其它的时候就是\r。

  这可就可以处理跨平台的差异问题了,但总感觉不是很高科技的样子。。。

标签: 站UI设计