編寫Qt Designer自定義控件——改善法(提升法)

Qt中控件類的提升(如果調用自定義類的控件)
https://blog.csdn.net/qq_41399894/article/details/92803923
QT程序設計:擴展Qt控件方法
https://blog.csdn.net/jekcai/article/details/80436581

Qt中控件類的提升(如果調用自定義類的控件)

新建一個空的項目,在UI文件中加入pushbutton,右鍵點擊提升類,出現:

此時的提升的類選項爲無;

接下來:添加新文件->自定義一個類,繼承pushbutton,代碼如圖:

  1. CMyPushButton.h中:
  2. #ifndef CMYPUSHBUTTON_H
  3. #define CMYPUSHBUTTON_H
  4. #include <QPushButton>
  5. #include <QMouseEvent>
  6. class CMyPushButton : public QPushButton
  7. {
  8. public:
  9. CMyPushButton(QWidget *parent=0);
  10. protected:
  11. void mousePressEvent(QMouseEvent * e);
  12. };
  13. #endif // CMYPUSHBUTTON_H
  14. CMyPushButton.c中:
  15. #include "cmypushbutton.h"
  16. #include "QDebug"
  17. CMyPushButton::CMyPushButton(QWidget *parent):QPushButton(parent)
  18. {
  19. }
  20. void CMyPushButton::mousePressEvent(QMouseEvent * e)
  21. {
  22. if(e->button()==Qt::LeftButton)
  23. {
  24. qDebug()<<"leftbutton clicked";
  25. }
  26. }

所有文件:

除了mainwindow.ui一個按鈕控件,其他沒有東西,進入mainwindow.ui

點擊提升爲->輸入自定義類的名稱:

點擊添加:

勾選,點擊提成,之後生成就可以了,現在看效果:

成功之後類名也會發生相應的變化

點擊發現出現的是CMyPushButton類的打印信息,窗口卻是MainWindow

QT程序設計:擴展Qt控件方法

擴展Qt控件:

       Qt自帶控件,一般無法滿足一些自定義的操作。例如QGraphicsView,原生的無法響應鼠標滾輪事件實線縮放,同樣也無法通過鼠標右鍵拖拽。相應的可以通過鼠標滾輪響應滾動條滾動。此處可以通過擴展原生的QGraphicsView控件實現上述功能,並屏蔽掉鼠標滾輪操作滾動條滾動。類似的控件還有,QListView,實現點擊元素,可以發出信號響應對應的槽。

擴展方法:

  • 步驟一:需要編寫自己的控件類繼承自Qt原生的控件類,例如:
  1. class MyGraphicsViewpublic QGraphicsView
  2. {
  3. Q_OBJECT
  4. public:
  5. explicit MyGraphicsView(QWidget* parent = 0);
  6. virtual ~MyGraphicsView();
  7. protected:
  8. virtual void mousePressEvent(QMouseEvent* event);
  9. virtual void mouseMoveEvent(QMouseEvent* event);
  10. virtual void mouseReleaseEvent(QMouseEvent* event);
  11. virtual void wheelEvent(QWheelEvent* event);
  12. }

      並重寫其中的方法,實現自己需要的功能。還可以對其進行擴展,實現自己需要的功能。

  • 步驟二:打開mainwindow.ui佈局文件,選中你需要進行擴展的控件,在其上點擊右鍵:

      再點擊“提升爲”按鈕:

       例如:此處我需要擴展QTextEdit控件,我需要將我寫好的類名添加到“提升的類名稱”一欄,相應的類的頭文件會根據類名,自動添加到“頭文件”一欄。所以需要注意,類的頭文件名需要和類名保持一致,儘量使用Qt提供的類自動創建文件的方式創建。

       最後如上:勾選添加的類,並點擊“提升”按鈕。相應的控件會提升爲自定義類型:

 

先前使用過比較錯誤方法:

       Qt中佈局文件對應的類,會在重新構建時重新生成,但在每次的運行過程中,不會對其進行改變(可能和Qt的編譯方式有關)因此,可以在mainwindow.cpp文件中找到ui_mainwindow.h的程序入口:

可以在MainWindow的構造函數中添加:

ui->graphicsView = new MyGraphicsView;

然後在ui_mainwindow.h中找到一句:

graphicsView = new QGraphicsView(centralWidget);

並將其註釋掉。並保持在每次重新構建後,來到ui_mainwindow.h文件中將其註釋掉。同樣可以達到重寫原生控件的目的。

其原理是,C++類繼承中的向下轉型,父類的指針可以指向子類的對象。並調用重寫掉的父類的方法。這個語法的別名是:動態綁定。

但是比較遺憾的是,無法使用,自己擴展出來的有別於父類的新的方法。這是因爲,父類的指針雖然可以指向子類的對象,但是無法調用,在子類中擴展出來的新的方法。這個語法的別名叫做:靜態聯編。

所以以上方法,雖然可以解決部分問題,但總的來說不是編輯Qt工程擴展控件應該使用的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章