實例 Qt 自定義控件捕獲鼠標(biāo)消息
GUI 即人機(jī)交互圖形化用戶界面設(shè)計。縱觀國際相關(guān)產(chǎn)業(yè)在圖形化用戶界面設(shè)計方面的發(fā)展現(xiàn)狀,許多國際知名公司早已意識到 GUI 在產(chǎn)品方面產(chǎn)生的強(qiáng)大增值功能,以及帶動的巨大市場價值,因此在公司內(nèi)部設(shè)立了相關(guān)部門專門從事 GUI 的研究與設(shè)計,同業(yè)間也成立了若干機(jī)構(gòu),以互相交流 GUI 設(shè)計理論與經(jīng)驗為目的。
下午剛在qt中文論壇逛了下,發(fā)現(xiàn)有人提問說:能不能讓鼠標(biāo)一移動到QlineEdit的控件上就觸發(fā)一個信號,我想了想,覺得這是可行的,根據(jù)在windows上的經(jīng)驗,要想讓這樣的控件也來捕獲鼠標(biāo)之類的消息,可以是這樣做的:
自己從系統(tǒng)默認(rèn)的控件類里派生出自己的控件類來。其實這個這個類最主要的作用就是能讓自己來寫一些處理鼠標(biāo)之類的函數(shù),比方說在MFC里讓自己的這個控件類來增加對WM_MOUSEMOVE消息的處理函數(shù)。這樣鼠標(biāo)一移動到控件上,我們自己的程序就能處理鼠標(biāo)的移動消息了。
那么qt中能不能也這樣呢,翻了翻文檔,在Qwidget里發(fā)現(xiàn)有一個enterEvent()的函數(shù),文檔介紹說一旦鼠標(biāo)移動到Qwidget的時候,enterEvent()這個函數(shù)將被調(diào)用。所以我們也可以從控件類里派生出來一個自己的控件類,然后自己實現(xiàn)enterEvent()函數(shù),在這個函數(shù)里發(fā)射一個信號。這就OK了。
大致代碼:
- class MyEdit:public QlineEdit
- {
- Q_OBJECT
- public:
- MyEdit(QWidget * parent, const char * name);
- void enterEvent( QEvent * e);
- };
- MyEdit::MyEdit(QWidget * parent, const char * name):QLineEdit(parent,name)
- {
- this->setText("11.11");
- }
- void MyEdit::enterEvent( QEvent * e)
- {
- QString s = this->text();
- emit textChanged (s);
- }
我現(xiàn)在把textChanged (s)信號連接到一個顯示部件里,用QLCDNumber部件。
- class MyWindow:public QVBox
- {
- public:
- MyWindow();
- private:
- MyEdit * lineedit;
- QLCDNumber * lcdnum;
- };
- MyWindow::MyWindow()
- {
- QHBox* hbox1 = new QHBox(this);
- lineedit = new MyEdit(hbox1,0);
- QHBox* hbox2 = new QHBox(this);
- lcdnum = new QLCDNumber(hbox2);
- connect(lineedit,SIGNAL(textChanged ( const QString & )),lcdnum,SLOT(display ( const QString &)));
- }
主函數(shù):
- int main(int argc, char **argv)
- {
- QApplication a(argc, argv);
- MyWindow w;
- a.setMainWidget(&w);
- w.setGeometry(500,200,200,150);
- w.show();
- a.exec();
- }
OK了
其實我覺得這是個經(jīng)驗問題,像GUI程序,我覺得只是一些實現(xiàn)的類庫不一樣,比方說用qt的用qt,用MFC的用MFC,其實很多思路都會是差不多的。而只要你比較熟悉一種GUI庫了,其他的學(xué)起來都比較的輕松了。因為等到你一種庫搞得比較的熟悉了,GUI該有的些什么功能阿,控件阿,都比較熟悉了,我覺得就只剩下用什么用的庫來實現(xiàn)的問題了。這個時候只要有一份某種GUI庫的文檔。很多問題就號解決了。
小結(jié):