Qt類聲明中Q_OBJECT的作用與報錯解決


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的作用是什么我還不太懂,有待后面繼續學習!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM