2012-10-23 24 views
-3

我有一個容器有很多問題的類,這次如果我用非默認構造函數創建我的對象我無法控制容器中的對象(更改價值,可見...);但如果我用默認的構造函數定義我的對象,我可以很容易地做到這一點。我的課沒有完美的容器

Control.h

class Controls : public QObject 
{ 

private: 

    QHBoxLayout *Layout ; 
    string Controlname; 
    QLabel *Label ; 

    QSpinBox *Spin ; 


public: 
    QSlider *Slider ; 
    Controls(QLayout &Parent , string name , const int &Default_value); 
    Controls(const Controls &copy); 
    Controls(); 
    Controls(QLayout &Parent); 
    ~Controls(); 


    QLabel * Get_Label()const { return Label ; } 
    QSlider * Get_Slider()const { return Slider ; } 
    QSpinBox * Get_Spin()const { return Spin ; } 
    QHBoxLayout * Get_Layout() {return Layout;} 

    void SetValue(const int &newvalue); 

    Controls &operator= (const Controls &copy); 


}; 

controls.cpp

#include "Interface.h" 
Controls &Controls::operator= (const Controls &copy) 
{ 
    Slider->setValue(copy.Get_Slider()->value()); 
    Slider->setOrientation(Qt::Horizontal); 
    Label->setText(copy.Get_Label()->text()); 
    Spin->setValue(copy.Get_Spin()->value()); 

    Layout->addWidget(Label , 0 , 0); 
    Layout->addWidget(Slider , 0 , 0); 
    Layout->addWidget(Spin , 0 , 0); 

    QObject::connect(Slider , SIGNAL(valueChanged(int)) , 
        Spin , SLOT(setValue(int))); 
    QObject::connect(Spin , SIGNAL(valueChanged(int)) , 
        Slider , SLOT(setValue(int))); 

    return *this; 
} 

Controls::Controls(const Controls &copy) 
{ 
    Label = new QLabel() ; 
    Slider = new QSlider() ; 
    Spin = new QSpinBox() ; 
    Layout = new QHBoxLayout(); 

    Slider->setValue(copy.Get_Slider()->value()); 
    Slider->setOrientation(Qt::Horizontal); 
    Label->setText(copy.Get_Label()->text()); 
    Spin->setValue(copy.Get_Spin()->value()); 

    Layout->addWidget(Label , 0 , 0); 
    Layout->addWidget(Slider , 0 , 0); 
    Layout->addWidget(Spin , 0 , 0); 

    QObject::connect(Slider , SIGNAL(valueChanged(int)) , 
        Spin , SLOT(setValue(int))); 
    QObject::connect(Spin , SIGNAL(valueChanged(int)) , 
        Slider , SLOT(setValue(int))); 
} 

Controls::Controls() 
{ 
    Label = new QLabel() ; 
    Slider = new QSlider() ; 
    Spin = new QSpinBox() ; 
    Layout = new QHBoxLayout(); 

    Slider->setValue(0); 
    Slider->setOrientation(Qt::Horizontal); 
    Label->setText(QString ("unamed")); 
    Spin->setValue(0); 


    Layout->addWidget(Label , 0 , 0); 
    Layout->addWidget(Slider , 0 , 0); 
    Layout->addWidget(Spin , 0 , 0); 

    QObject::connect(Slider , SIGNAL(valueChanged(int)) , 
        Spin , SLOT(setValue(int))); 
    QObject::connect(Spin , SIGNAL(valueChanged(int)) , 
        Slider , SLOT(setValue(int))); 
} 


Controls::Controls(QLayout &Parent , string name , const int &Default_value) 
{ 
    Controlname = name ; 

    Label = new QLabel() ; 
    Slider = new QSlider() ; 
    Spin = new QSpinBox() ; 
    Layout = new QHBoxLayout(); 

    Slider->setValue(Default_value); 
    Slider->setOrientation(Qt::Horizontal); 
    Label->setText(QString (name.c_str())); 
    Spin->setValue(Default_value); 


    Layout->addWidget(Label , 0 , 0); 
    Layout->addWidget(Slider , 0 , 0); 
    Layout->addWidget(Spin , 0 , 0); 

    QObject::connect(Slider , SIGNAL(valueChanged(int)) , 
        Spin , SLOT(setValue(int))); 
    QObject::connect(Spin , SIGNAL(valueChanged(int)) , 
        Slider , SLOT(setValue(int))); 

    Parent.addItem(Layout); 
} 

void Controls::SetValue(const int &newvalue) 
{ 
    Slider->setValue(newvalue); 
} 

Controls::~Controls() 
{ 
} 

的main.cpp

int main() 
{ 
    QApplication app (argc , argv); 

    QVBoxLayout layout ; 
    QLabel Image ; 
    QWidget Panel ; 
    Camera Cm ; 


    vector <Controls> g ; 
    g.push_back(Controls(layout ,"c1" , 33)); 
    g.push_back(Controls(layout ,"c2" , 13)); 
    g.push_back(Controls(layout ,"c3" , 63)); 
    g.push_back(Controls(layout ,"c1" , 33)); 


    for (int x =0 ; x<g.size() ; x++) 
    { 
    g.at(x).SetValue(33); ////not work 

    } 

    vector <Controls> g2 ; 
    g2.push_back(Controls()); 
    g2.push_back(Controls()); 
    g2.push_back(Controls()); 
    g2.push_back(Controls()); 


    for (int x =0 ; x<g2.size() ; x++) 
    { 
    layout.addItem(g2.at(x).Get_Layout()); 
    g2.at(x).SetValue(33); ////this work 

    } 


    Panel.setLayout(&layout); 
    Panel. show(); 

    return app.exec(); 

    return 0; 
} 
+1

TLDR。您的副本構造函數或賦值運算符可能是問題。這就是容器複製和/或分配對象時通常會導致此問題的原因。 –

+0

感謝您的回覆!我認爲這是問題,我嘗試解決它,但是,我看不到任何問題 – user1728234

+0

QXxx * const返回類型是什麼?你知道'const'在這種情況下被忽略。 –

回答

2

你不應該有Controls拷貝構造函數或賦值操作符在所有,你應該將類型Controls*的值存儲在向量中而不是typ e Controls

創建GUI對象的複製構造函數非常值得懷疑。有一個原因QLabel,QSlider,QSpinBoxQHBoxLayout本身沒有拷貝構造函數。它會導致代碼非常慢,並很快變得混亂。

總之,你應該幾乎從不擁有從QObject繼承的對象的複製構造函數。

+0

我不能肯定地說你是對的,因爲我不使用Qt,但是我敢打賭。在Windows上,這將是一個惡意的窗體,父母,組件列表,控制列表,GDI/Windows句柄,CreateWindow()等等。 –

+0

+1這是Qt的重要概念,Q_OBJECT宏可以自動執行它:https://qt-project.org/doc/qt-4.8/qobject.html#no-copy-constructor – cmannett85

相關問題