2014-10-30 89 views
-1

我想創建一個簡單的應用程序,其中使用OpenGL生成三角形,並使用三個按鈕更改三角形顏色。生成三角形但不幸的是按鈕不工作,我得到的錯誤說:Qt,OpenGL Widget,沒有這樣的插槽

的QObject ::連接:沒有這樣的插槽的MainWindow :: redSlot(OGL)在 .. \ buttonwidget \ mainwindow.cpp:17 QObject :: connect:沒有這樣的插槽 MainWindow :: greenSlot(OGL)in .. \ buttonwidget \ mainwindow.cpp:20 QObject :: connect:沒有這樣的插槽MainWindow :: blueSlot(OGL)在 .. \ buttonwidget \ mainwindow.cpp:23

我有插槽定義:

void MainWindow::redSlot(Widget* w) 
{ 
    w->setColor(red); 
} 

void MainWindow::greenSlot(Widget* w) 
{ 
    w->setColor(green); 
} 

void MainWindow::blueSlot(Widget* w) 
{ 
    w->setColor(blue); 
} 

它們正在改變在Widget類中聲明的變量,這些變量改變了生成的三角形的顏色。這裏有一流的Widget:

class Widget : public QGLWidget 
{ 
    Q_OBJECT 

public: 
    Widget(QWidget *parent = 0); 

    QSize minimumSizeHint() const; 
    QSize sizeHint() const; 

    enum color c; 

    void setColor(enum color color1); 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 

}; 

然後我在課堂上插槽連接按鈕主窗口構造函數:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    layout = new QVBoxLayout(); 

    QWidget *w = new QWidget(); 
    setCentralWidget(w); 

    w->setLayout(layout); 

    Widget *OGL = new Widget(); 

    //OGL->c=green; - it was a test whether changing value of enum type variable c works 
    //it works, changing it changes the color of a generated triangle 

    redButton = new QPushButton(tr("Red")); 
    connect(redButton, SIGNAL(clicked()), this, SLOT(redSlot(OGL))); 

    greenButton = new QPushButton(tr("Green")); 
    connect(greenButton, SIGNAL(clicked()), this, SLOT(greenSlot(OGL))); 

    blueButton = new QPushButton(tr("Blue")); 
    connect(blueButton, SIGNAL(clicked()), this, SLOT(blueSlot(OGL))); 

    layout->addWidget(OGL); 
    layout->addWidget(redButton); 
    layout->addWidget(greenButton); 
    layout->addWidget(blueButton); 
} 

下面是標題時隙聲明:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

    QVBoxLayout *layout; 

public: 
    MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 


private: 
    QPushButton *redButton; 
    QPushButton *greenButton; 
    QPushButton *blueButton; 

public slots: 
    void redSlot(Widget*); 
    void greenSlot(Widget*); 
    void blueSlot(Widget*); 

}; 

我應該如何使他們的工作?

+0

你把聲明之前的插槽關鍵字在'MainWindow'頭,如果你沒有做一個乾淨和重建 – 2014-10-30 10:20:20

+0

我用Qt已經有一段時間了,但我依稀記得這個錯誤。你是否正確使用MOC編譯器?您是否正確定義了您的插槽(使用標題中的「public slot:」)? – kroneml 2014-10-30 10:21:23

+0

我建議你在遇到這樣的問題之前學習一些Qt基礎知識:http://qt-project.org/doc/qt-5/signalsandslots.html。如果你遇到了一些問題,你應該提供一個完整的代碼的SSCCE,它完全描述你的問題,而不是從你的真實項目中發佈一些代碼片段。 – 2014-10-30 10:26:14

回答

1

連接在QT是基於字符串,這意味着:

connect(redButton, SIGNAL(clicked()), this, SLOT(redSlot(OGL))); 

將無法​​正常工作,因爲你還沒有定義一個時隙 「redSlot(OGL)」,而不是你將不得不使用

...SLOT(redSlot(Widget*))); 

而且,可以定義SLOT用更少的參數,但沒有更多的,因此您的插槽/連接已經看起來像

void redSlot(); 

connect(redButton, SIGNAL(clicked()), this, SLOT(redSlot())); 

如果您需要指向「小工具」的指針,則必須從其他位置檢索它。

例子:在「窗口小部件」級定義插槽和改變連接到:

connect(redButton, SIGNAL(clicked()), OGL, SLOT(redSlot())); 
+0

那麼我該如何影響我的小部件OGL?我需要改變存儲在其中的變量的值,以改變三角形的顏色,我不能提出一個不同的解決方案。 – user30935 2014-10-30 10:28:22

+0

在您的「Widget」類中定義插槽而不是MainWindow,因此您可以直接訪問相關數據。它也會更清潔(至少對我來說) – Robert 2014-10-30 10:38:37

+0

好的,這真的很有道理。我已經在我的Widget類中定義了我的插槽,但我仍然得到如下錯誤: 沒有這樣的插槽MainWindow :: greenSlot() 這是驚人的,因爲greenSlot()不再在MainWindow類 – user30935 2014-10-30 10:50:59