GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。

GUI 即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事 GUI 的研究与设计,同业间也成立了若干机构,以互相交流 GUI 设计理论与经验为目的。

实例 Qt 自定义控件捕获鼠标消息(qt自定义控件鼠标点击事件)  控件 鼠标 GUI 第1张

下午刚在Qt中文论坛逛了下,发现有人提问说:能不能让鼠标一移动到QlineEdit的控件上就触发一个信号,我想了想,觉得这是可行的,根据在windows上的经验,要想让这样的控件也来捕获鼠标之类的消息,可以是这样做的:

自己从系统默认的控件类里派生出自己的控件类来。其实这个这个类最主要的作用就是能让自己来写一些处理鼠标之类的函数,比方说在MFC里让自己的这个控件类来增加对WM_MOUSEMOVE消息的处理函数。这样鼠标一移动到控件上,我们自己的程序就能处理鼠标的移动消息了。

那么qt中能不能也这样呢,翻了翻文档,在Qwidget里发现有一个enterEvent()的函数,文档介绍说一旦鼠标移动到Qwidget的时候,enterEvent()这个函数将被调用。所以我们也可以从控件类里派生出来一个自己的控件类,然后自己实现enterEvent()函数,在这个函数里发射一个信号。这就OK了。

大致代码:

  1. classMyEdit:publicQlineEdit
  2. {
  3. Q_OBJECT
  4. public:
  5. MyEdit(QWidget*parent,constchar*name);
  6. voidenterEvent(QEvent*e);
  7. };
  8. MyEdit::MyEdit(QWidget*parent,constchar*name):QLineEdit(parent,name)
  9. {
  10. this->setText("11.11");
  11. }
  12. voidMyEdit::enterEvent(QEvent*e)
  13. {
  14. QStrings=this->text();
  15. emittextChanged(s);
  16. }

我现在把textChanged (s)信号连接到一个显示部件里,用QLCDNumber部件。

  1. classMyWindow:publicQVBox
  2. {
  3. public:
  4. MyWindow();
  5. private:
  6. MyEdit*lineedit;
  7. QLCDNumber*lcdnum;
  8. };
  9. MyWindow::MyWindow()
  10. {
  11. QHBox*hbox1=newQHBox(this);
  12. lineedit=newMyEdit(hbox1,0);
  13. QHBox*hbox2=newQHBox(this);
  14. lcdnum=newQLCDNumber(hbox2);
  15. connect(lineedit,SIGNAL(textChanged(constQString&)),lcdnum,SLOT(display(constQString&)));
  16. }

主函数:

  1. intmain(intargc,char**argv)
  2. {
  3. QApplicationa(argc,argv);
  4. MyWindoww;
  5. a.setMainWidget(&w);
  6. w.setGeometry(500,200,200,150);
  7. w.show();
  8. a.exec();
  9. }

OK了

其实我觉得这是个经验问题,像GUI程序,我觉得只是一些实现的类库不一样,比方说用qt的用qt,用MFC的用MFC,其实很多思路都会是差不多的。而只要你比较熟悉一种GUI库了,其他的学起来都比较的轻松了。因为等到你一种库搞得比较的熟悉了,GUI该有的些什么功能阿,控件阿,都比较熟悉了,我觉得就只剩下用什么用的库来实现的问题了。这个时候只要有一份某种GUI库的文档。很多问题就号解决了。

小结:

转载请说明出处
知优网 » 实例 Qt 自定义控件捕获鼠标消息(qt自定义控件鼠标点击事件)

发表评论

您需要后才能发表评论