QT如何自定義控件並添加到控件列表,可以參考如下網頁:
1、http://www.cnblogs.com/feiyangqingyun/p/6128288.html
2、http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html
這里我想記錄的是,自定義的控件何時繪制的,繪制的大小如何制定的。
自定義控件需要定義一個控件的Class,控件的所有動作都在該class種實現,以前對界面編程沒有深入理解,現在感覺其實所有的控件都是一個個class,與其他class沒有區別,只是控件class主要精力是實現了繪圖功能,以及鼠標鍵盤響應功能。
Qt中控件也是一個個Class,所以定義自定義控件需要創建一個class並繼承與現有的控件class或者widget,作為父類的控件class或者QWidget class已經實現了大部分功能,並提供一些虛函數供子類實現,自定義控件類只需要重寫或者增加少量的函數實現便可以生成一個不錯控件。
在自定義控件類中個人理解有兩個地方可以實現控件外觀的定制,第一個是構造函數,第二個是paintEvnet函數。
1、在構造函數中其實不能很好的更改控件的外觀,畢竟最后在控件顯示前還是要調用父類的paintEvent進行外觀繪制,構造函數中對控件外觀的修改,主要是對父類控件外觀的修補,外觀框架仍然采用的是父類的框架。但構造函數中還是可以修改父類的一些特性,比如大小,image顯示或者一些點擊行為等,下面是一個switchButton的控件類的構造函數,在該構造函數中限定了控件大小與顯示的圖片等,通過圖片替換方式實現開關按鈕的開關動作。下圖是一個自定義開關按鈕。
SwitchButton::SwitchButton(QWidget *parent): QPushButton(parent) { setCursor(QCursor(Qt::PointingHandCursor)); isCheck = false; styleOn = "background-image: url(:/image/btncheckon.png); border: 0px;"; styleOff = "background-image: url(:/image/btncheckoff.png); border: 0px;"; setFocusPolicy(Qt::NoFocus); setFixedSize(87, 28); //不允許變化大小 setStyleSheet(styleOn);//設置當前樣式 connect(this, SIGNAL(clicked()), this, SLOT(ChangeOnOff())); }
2、在paintEvent中重新繪制控件,可以靈活自由的創建想要的控件,不過需要編寫的代碼多些,如下代碼中
resetVariables(&painter); drawBackground(&painter);//繪制背景 drawBox(&painter);//繪制控件外框 drawText(&painter);//繪制控件文本 drawGraph(&painter);//繪制控件內部圖形 drawTitle(&painter);
,均是需要自己定義的函數,通過實現這些函數實現自定義的空間。
這里有一個細節,自己只是搞懂一部分,即繪制控件的坐標問題,控件繪制多大,以哪一點為基准點?其中一個方向是通過構造函數將父窗口指針傳入,這樣控件的所有坐標,長寬度等都可以以父窗口為基准了。但是我有一個疑問,是否可以不關聯父窗口,在自定義控件中自己繪制一個指定大小的外框,坐標從(0,0)開始,並以此為基准繪制內部控件外觀?這個看看能不能從自定義控件的源碼中找到答案。
void myChart1::paintEvent(QPaintEvent *e) { QPainter painter; painter.begin(this); if(m_bUseAntialiasing) { painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing); } resetVariables(&painter); drawBackground(&painter);//繪制背景 drawBox(&painter);//繪制控件外框 drawText(&painter);//繪制控件文本 drawGraph(&painter);//繪制控件內部圖形 drawTitle(&painter); }
mychart1=new myChart1(ui->fm2);//傳入父窗口指針,從而獲得fm2的很多重要屬性