簡體   English   中英

我不知道我的變量是否未初始化或其他

[英]I don't know if my variables are not being initialized or something else

因此,在Qt中調試程序后,我意識到調試器認為我沒有初始化變量。 但是,我將變量從私有類中取出來,使該類成為指針,並且似乎什么也沒發生。 請讓我知道我缺少什么,我在其他程序中有同樣的問題,但我不知道是我還是該程序。

代碼如下:

主要:

#include "selectionarea.h"
#include <QApplication>
#include <QtWidgets>


int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

    // QMainWindow *win = new QMainWindow();

     QSize winsize(500,500);
     SelectionArea area;

     area.setStartingLocX(0);
     area.setStartingLocY(0);
     area.setLength(300);
     area.setWidth(300);


     area.resize(winsize);
     area.show();


     return app.exec();
 }

selectionarea.cpp

#include "selectionarea.h"
#include <QPainter>
#include <QDebug>
#include <QLabel>


SelectionArea::SelectionArea()
{


}

void SelectionArea::paintEvent(QPaintEvent *)
{

    QRect rectangle(getStartingLocx(), getStartingLocy(),
                     getWidth(), getLength());

    /*QRegion Constructs a paint event object with the
     * region that needs to be updated. The region is
     * specified by paintRegion.*/

    QPainter painter(this);
    painter.setPen(QPen(Qt::SolidPattern,
                        2.0,
                        Qt::SolidLine,
                        Qt::FlatCap,
                        Qt::MiterJoin));
    painter.drawRect(rectangle);

}

void SelectionArea::setStartingLocX(int x)
{
    x=StartingLocX;
    qDebug() <<x<<" "<<StartingLocX;

}
int SelectionArea::getStartingLocx()
{
     return StartingLocX;
}

void SelectionArea::setStartingLocY(int y)
{
    y=StartingLocY;
     qDebug() <<y<<" "<<StartingLocY;
}

int SelectionArea::getStartingLocy()
{
     return StartingLocY;
}

void SelectionArea::setWidth(int w)
{
    w=Width;
    qDebug() <<w<<" "<<Width;
}

int SelectionArea::getWidth()
{
    return Width;
}

void SelectionArea::setLength(int l)
{
    l=Length;
}

int SelectionArea::getLength()
{
    return Length;
}

和selectionarea.h

#ifndef SELECTIONAREA_H
#define SELECTIONAREA_H

#include <QPixmap>
#include <QLabel>
#include <QRect>

class SelectionArea : public QLabel
{
    int StartingLocX;
    int StartingLocY;
    int Length;
    int Width;

public:

    SelectionArea();
    ~SelectionArea()
    {

    }

    void setStartingLocX(int);
    void setStartingLocY(int);
    void setLength(int);
    void setWidth(int);

    int getStartingLocx();
    int getStartingLocy();
    int getWidth();
    int getLength();

    virtual void paintEvent(QPaintEvent *);



};

#endif // SELECTIONAREA_H

原諒我的含糊。

UPDATE:應用程序輸出為0 0 0 0 0 0

並顯示窗口。

讓我的評論成為答案

您的setter函數實際上應該如下所示:

void SelectionArea::setStartingLocX(int x)
{
    StartingLocX = x;
}

因為您使用x的值初始化了類成員變量StartingLocX (與其他setter函數相同)。 在函數的版本中,您執行相反的操作,以便使類成員變量保持未初始化狀態。

創建SelectionArea實例時,不要初始化成員變量。 之后,只能通過設置器功能設置它們。

您應該使用構造函數列表在構造函數中對它們進行初始化

在這種情況下,這可能已過時,但是它將防止您遇到奇怪的錯誤情況。

這是非常非慣用的C ++:

SelectionArea area;
area.setStartingLocX(0);
area.setStartingLocY(0);
area.setLength(300);
area.setWidth(300);

您應該將代碼重構為:

SelectionArea area{0, 0, 300, 300};

甚至

SelectionArea area{300, 300};

此外,您確實應該使它成為真正的QObject ,而不是QObject 並且不要用您自己的類似名稱witdth() QWidget自己的成員(例如witdth()等)。 Getter不必具有get前綴,它只會增加視覺混亂,並且無濟於事。

我在下面添加的屬性可能過大了,只需添加您合理使用的屬性即可。 只是將整個選擇保留為QRect ,這仍然是一個好主意-確實如此。

class SelectionArea : public QLabel
{
  Q_OBJECT
  Q_PROPERTY(QRect selection READ selection WRITE setSelection USER true)
  Q_PROPERTY(QPoint selTopLeft READ selTopLeft WRITE setSelTopLeft STORED false)
  Q_PROPERTY(int selX READ selX WRITE setSelX STORED false)
  Q_PROPERTY(int selY READ sely WRITE setSelY STORED false)        
  Q_PROPERTY(QSize selSize READ selSize WRITE setSelSize STORED false)
  Q_PROPERTY(int selWidth READ selWidth WRITE setSelWidth STORED false)
  Q_PROPERTY(int selHeight READ selHeight WRITE setSelHeight STORED false)
  QRect m_selection;
public:
  SelectionArea(QWidget * parent = 0) : QLabel(parent) {}
  SelectionArea(const QSize & size, QWidget * parent = 0) :
    QLabel(parent), m_selection(QPoint(), size) {}
  SelectionArea(const QPoint & startingLoc, const QSize & size, 
                QWidget * parent = 0) :
    QLabel(parent), m_selection(startingLoc, size) {}
  SelectionArea(int width, int height, QWidget * parent = 0) :
    QLabel(parent), m_selection(0, 0, width, height) {}
  SelectionArea(int x, int y, int width, int height, QWidget * parent = 0) :
    QLabel(parent), m_selection(x, y, width, height) {}

  void setSelection(const QRect & r) {
    if (m_selection == r) return;
    m_selection = r;
    update();
  }
  void setSelTopLeft(const QPoint & p) {
    if (m_selection.topLeft() == p) return; 
    m_selection.moveTo(p);
    update();
  }
  void setSelX(int x) {
    if (m_selection.x() == x) return;
    m_selection.moveTo(x, m_selection.y());
    update(); 
  }
  void setSelY(int y) {
    if (m_selection.y() == y) return;
    m_selection.moveTo(m_selection.x(), y);
    update(); 
  }
  void setSelSize(const QSize & s) {
    if (m_selection.size() == s) return;
    m_selection.setSize(s);
    update();
  }
  // etc.

  QRect selection() const { return m_selection; }
  QPoint selTopLeft() const { return m_selection.topLeft(); }
  int selX() const { return m_selection.x(); }
  int selY() const { return m_selection.y(); }
  QSize selSize() const { return m_selection.size(); }
  // etc.

protected:
  void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE;
};

是否真的要從QLabel派生也是一個問題。 似乎您覆蓋了繪畫,並且您實際上並不直接在乎text屬性。 您最好直接從QFrame繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM