我有两个功能,其中一个叫另一个。我想使用它们中的一个作为按钮中的clicked()的插槽,所以这是我的planevolume.h代码的一部分,所以你可以理解:
#ifndef PLANEVOLUME_H
#define PLANEVOLUME_H
#include <QMainWindow>
namespace Ui {
class planevolume;
}
//more stuff here
class planevolume : public QMainWindow {
Q_OBJECT
public:
planevolume(QWidget *parent = 0);
~planevolume();
protected:
void changeEvent(QEvent *e);
private:
Ui::planevolume *ui;
//more stuff here
public slots:
void AlignXAxis(int xmin, int xmax, vtkImagePlaneWidget* planeX);
void AlignCamera(vtkImagePlaneWidget* current_widget);
};
#endif // PLANEVOLUME_H
我会在这里放一些我的planevolume.cpp,这样你就可以理解我得到的错误是什么。
#include <qwidget.h>
#include <qaction.h>
#include <qobject.h>
//more includes
// Define AlignCamera
void planevolume::AlignCamera(vtkImagePlaneWidget* current_widget)
{
//regular statements of a function
vtkCamera *camera=ren->GetActiveCamera();
camera->SetViewUp(vx, vy, vz);
camera->SetFocalPoint(cx, cy, cz);
camera->SetPosition(px, py, pz);
camera->OrthogonalizeViewUp();
ren->ResetCameraClippingRange();
renWin->Render();
}
// Define the action of AlignXAxis
void planevolume::AlignXAxis(int xmin, int xmax, vtkImagePlaneWidget* planeX)
{
//regular statements of a function
vtkImagePlaneWidget *current_widget= planeX;
ui->horizontalScrollBar->setValue(slice_number);
ui->horizontalScrollBar->setMinimum(xmin);
ui->horizontalScrollBar->setMaximum(xmax);
AlignCamera(current_widget);//here I call the other one
}
planevolume::planevolume(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::planevolume)
{
ui->setupUi(this);
//regular stuff
//I think here is the problem when i make the connect
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(AlignXAxis(int, int, vtkImagePlaneWidget)));
// Start the initialization and rendering
renWin->Render();
//iren->Initialize();
//iren->Start();
// Assign the rendering window to the qvtkwidget
ui->qvtkWidget->SetRenderWindow(renWin);
}
所以它们编译好了,但是当我点击按钮时它只是在应用程序的输出上显示:
Object :: connect:planevolume.cpp中没有这样的slot planevolume :: AlignXAxis(int,int,vtkImagePlaneWidget):386 Object :: connect :(发件人姓名:'pushButton') Object :: connect :(接收者名称:'planevolume')
所以如果有人知道我做错了什么,请给我一些提示或者其他什么,因为这让我发疯了。 :)
答案 0 :(得分:3)
两个问题:
1。)插槽需要最后一个参数的指针而不是一个对象,因此连接中缺少*(这是在同时删除的答案中建议的)。但是,还有一个更大的问题:
2。)进行连接时,SIGNAL中的参数不可能比SLOT中的参数少
正确的方法是这样的:
connect( ui->pushButton, SIGNAL( clicked () ),
this , SLOT ( onButtonClicked() ) )
(注意:如果你很好奇我为什么要使用这么多空格:我这样做,这样我就可以很容易地发现哪个对象连接到哪个其他对象,哪个信号连接到哪个插槽以及参数是否匹配)< / p>
然后有一个这样的插槽:(。cpp文件)
/* private slot */
void planevolume::onButtonClicked()
{
int xMin = /* get the value from somewhere */
int xMax = /* get the value from somewhere */
vtkImagePlaneWidget* planeX = /* get the value from somewhere */
AlignXAxis( xMin, xMax, planeX );
}
包含以下内容的.h文件:
private slots:
void onButtonClicked();
当前连接的问题是clicked()信号不提供xMin,xMax和planeX的任何值。 Qt不知道从哪里读取这些值。