专业编程基础技术教程

网站首页 > 基础教程 正文

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

ccvgpt 2024-08-02 12:03:25 基础教程 15 ℃

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

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

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

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

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

在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->append(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"
#endif
//使用时
cout << "这是一行" << newLineChar << "这又是一行";

这样当.pro文件中宏定义为windows的时候,换行符就是\r\n,改为其它的时候就是\r。

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

Tags:

最近发表
标签列表