我使用QT创建器创建Ui表单。我有一个基本表单,其中包含5个按钮(testListForm)。我通过TestStatusForm在派生类(DisplayTestResultsForm)中继承了这个基类。当我点击派生类中的按钮时,函数on_pushbutton_1_clicked()被调用三次。 下面是代码段
class TestListForm : public TestBaseForm
{
Q_OBJECT
private slots:
virtual void on_pushButton_1_clicked();
virtual void on_pushButton_2_clicked();
virtual void on_pushButton_3_clicked();
virtual void on_pushButton_4_clicked();
virtual void on_pushButton_5_clicked();
}
class TestStatusForm : public TestListForm
{
Q_OBJECT
....
};
class DisplayTestResultsForm : public TestStatusForm
{
Q_OBJECT
private slots:
void on_pushButton_1_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
}
当我在DisplayTestResultsForm中调用on_pushButton_1_clicked时,我将此函数调用三次。我没有进行任何明确的连接调用,因为Ui将使用ConnectSlotByName来处理这个问题。 任何人都可以提出可能存在的问题吗?
提前致谢。
答案 0 :(得分:0)
有两个错误:
私人广告位是本地的。将它们变为虚拟没有意义,因为没有派生类看到它们。您必须使广告位受保护。
如果您有虚拟广告位,则只能将其声明为 moc 一次。 slots
宏为空,仅对 moc 工具有意义。声明槽的最基类应该将它们声明为槽。 派生类的所有必须不将它们声明为广告位,而只是Q_DECL_OVERRIDE
重新实现。
因此:
class TestListForm : public TestBaseForm
{
Q_OBJECT
protected slots: // protected, not private
virtual void on_pushButton_1_clicked();
virtual void on_pushButton_2_clicked();
virtual void on_pushButton_3_clicked();
virtual void on_pushButton_4_clicked();
virtual void on_pushButton_5_clicked();
}
class TestStatusForm : public TestListForm
{
Q_OBJECT
protected: // protected, overriden, no slots macro
void on_pushButton_1_clicked() Q_DECL_OVERRIDE;
void on_pushButton_2_clicked() Q_DECL_OVERRIDE;
void on_pushButton_3_clicked() Q_DECL_OVERRIDE;
void on_pushButton_4_clicked() Q_DECL_OVERRIDE;
void on_pushButton_5_clicked() Q_DECL_OVERRIDE;
}