2016-05-23 51 views
0

我有一個QMainWindow,它有一個QAction其信號triggered()連接到插槽about2()如何將插槽添加到QWidget?

... 
connect(mAboutAction2, SIGNAL(triggered()), this, SLOT(about2())); 
... 


void occQt::about2() //UI 
{ 
    QWidget* pWidget = new QWidget; 
    QPushButton* okbtn = new QPushButton(tr("ok")); 
    QPushButton* cancelbtn = new QPushButton(tr("cancel")); 
    btnlayout->addWidget(okbtn); 
    btnlayout->addWidget(cancelbtn); 
    dlglayout->setMargin(50); 
    dlglayout->addLayout(gridlayout); 
    dlglayout->addStretch(40); 
    dlglayout->addLayout(btnlayout); 
    pWidget->setLayout(dlglayout); 
    pWidget->setWindowTitle(tr("Make a Box by custom.")); 
    pWidget->show(); 
    connect(okbtn, SIGNAL(clicked()), pWidget, SLOT(make_a_box())); 
    connect(cancelbtn, SIGNAL(clicked()), pWidget, SLOT(close())); 
} 

void occQt::make_a_box() 
{ 
    TopoDS_Shape aTopoBox = BRepPrimAPI_MakeBox(3.0, 4.0, 95.0).Shape(); 
    Handle_AIS_Shape anAisBox = new AIS_Shape(aTopoBox); 

    anAisBox->SetColor(Quantity_NOC_AZURE); 

    mContext->Display(anAisBox); 
} 

當我運行插槽about2()時,UI會打開。當我點擊cancelbtn時,我可以關閉它,但我無法進入插槽make_a_box()

我可以在哪裏添加此插槽以使此代碼正常工作?

+0

我是否需要添加一個額外的.h,並在.h中添加一個插槽? – eason

回答

4

這是好的,運行良好,因爲您使用的插槽位於正確的位置:在您的occQt類中。現在

// You connect the signal FROM the action TO "this", i.e. your class 
connect(mAboutAction2, SIGNAL(triggered()), this, SLOT(about2())); 

void occQt::about2() //UI 
{ 

    QWidget* pWidget = new QWidget; 
    QPushButton* okbtn = new QPushButton(tr("ok")); 
    QPushButton* cancelbtn = new QPushButton(tr("cancel")); 
    btnlayout->addWidget(okbtn); 
    btnlayout->addWidget(cancelbtn); 
    dlglayout->setMargin(50); 
    dlglayout->addLayout(gridlayout); 
    dlglayout->addStretch(40); 
    dlglayout->addLayout(btnlayout); 
    pWidget->setLayout(dlglayout); 
    pWidget->setWindowTitle(tr("Make a Box by custom.")); 
    pWidget->show(); 

,這是不正常:

// You connect the signal FROM the button to pWidget, which doesn't have a slot make_a_box() 
connect(okbtn, SIGNAL(clicked()), pWidget, SLOT(make_a_box())); 

make_a_box()不爲pWidget,這是一個QWidget存在。您正嘗試將信號連接到不存在的插槽。

您的occQt類來定義這個插槽,和按鈕的信號clicked()連接到您的插槽類

// Now, you connect the signal FROM the button to "this", which is your class and has a slot make_a_box() 
connect(okbtn, SIGNAL(clicked()), this, SLOT(make_a_box())); 

在您的.h文件中,你將有:

private slots : 
    void make_a_box(); 

而在你的.cpp文件:

void occQt::make_a_box() 
{ 
    TopoDS_Shape aTopoBox = BRepPrimAPI_MakeBox(3.0, 4.0, 95.0).Shape(); 
    Handle_AIS_Shape anAisBox = new AIS_Shape(aTopoBox); 

    anAisBox->SetColor(Quantity_NOC_AZURE); 

    mContext->Display(anAisBox); 
} 
+0

我的pWidget中沒有插槽,請更改pWidget - > this。它運行! – eason