2017-06-22 周四 大雨 北京 院里
新建作圖類,繼承自QCUstomPlot類
因為需要同時作8張圖,都要單坐標縮放的功能,因此想干脆新建一個類,繼承自QCUstomPlot,把需要的功能都加上。類名取為QCUstomPlotPlus,最終成功版類代碼如下:
//聲明。explicit是為了禁止隱式轉換。
class QCustomPlotPlus : public QCustomPlot
{
Q_OBJECT //重要!
public:
explicit QCustomPlotPlus(QWidget *parent = 0);
private slots:
void mousePressFun();
void mouseWheelFun();
};
//函數定義
//構造函數:繼承自QCustomPlot,所以用QCustomPlot(parent)。
QCustomPlotPlus::QCustomPlotPlus(QWidget *parent) :
QCustomPlot(parent)
{
//設置單坐標方向縮放和拖拽
bool t1 = connect(this, SIGNAL(mousePress(QMouseEvent*)), SLOT(mousePressFun()));
bool t2 = connect(this, SIGNAL(mouseWheel(QWheelEvent*)), SLOT(mouseWheelFun()));
}
//鼠標點擊槽函數
void QCustomPlotPlus::mousePressFun()
{
// if an axis is selected, only allow the direction of that axis to be dragged
// if no axis is selected, both directions may be dragged
if (xAxis->selectedParts().testFlag(QCPAxis::spAxis))
axisRect()->setRangeDrag(xAxis->orientation());
else if (yAxis->selectedParts().testFlag(QCPAxis::spAxis))
axisRect()->setRangeDrag(yAxis->orientation());
else
axisRect()->setRangeDrag(Qt::Horizontal|Qt::Vertical);
}
//鼠標滾輪槽函數
void QCustomPlotPlus::mouseWheelFun()
{
// if an axis is selected, only allow the direction of that axis to be zoomed
// if no axis is selected, both directions may be zoomed
if (xAxis->selectedParts().testFlag(QCPAxis::spAxis))
axisRect()->setRangeZoom(xAxis->orientation());
else if (yAxis->selectedParts().testFlag(QCPAxis::spAxis))
axisRect()->setRangeZoom(yAxis->orientation());
else
axisRect()-> 大專欄 Qt類聲明中Q_OBJECT的作用與報錯解決;setRangeZoom(Qt::Horizontal|Qt::Vertical);
}
Qt類聲明中Q_OBJECT的作用
一開始在類聲明時,我沒有加入Q_OBJECT這一句代碼,結果信號和槽函數的連接總是不成功,無法實現單坐標縮放。
經過對比自動生成的類,我發現每一個類聲明都有Q_OBJECT,因此百度了一下。原來只有加入Q_OBJECT之后,才能正常使用信號和槽機制,囧TT……
加入Q_OBJECT后報錯的解決
在類聲明中加入Q_OBJECT后,程序構建報錯:
undefined reference to `vtable for QCustomPlotPlus'
沒有辦法,只好再百度,查到了這篇博文:Qt 出現“undefined reference to `vtable for”原因總結”。
在這篇文章里找到了解決方法:
問題:某一個類中如果加入Q_OBJECT后, 則link時提示:undefined reference to vtable for “xxx::xxx”.刪掉它則沒有任何問題.
解決:嘗試(1):把所有的obj文件和uic文件刪除,重新編譯.仍然失敗.去trolltech的 mail lists找到原因: 因為qmake生成Makefile的時候,這個類的頭文件中並沒有Q_OBJECT,所以在相應的Makefile里面並沒有用moc xxx.h命令,最終導致鏈接失敗.重新運行qmake,問題解決.在查找解決方法的時候,附帶發現一點:
qmake 不會處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的話,也會產生undefined reference to vtable for “xxx::xxx”. 這時,需要先用moc xxxx.cpp生成相應的moc文件,再包含到.cpp里面去,才能解決這個問題.
按照博文說法,我重新運行了qmake,成功構建,功能正確!
具體qmake的作用是什么我還不太懂,有待后面繼續學習!
