是否可以将插槽或常规功能从一个类连接到另一个类的插槽或常规功能? (QT)

时间:2016-12-28 23:43:38

标签: c++ qt pointers

为了解决我的问题,我一直试图将一个类的一个插槽连接到另一个类的常规功能。我试图这样做,所以我可以从对话框窗口关闭主窗口的ui。我尝试了所有我能想到的东西,但似乎每次我都想到尝试Qt编译器时会因为抛出一些错误而无法工作,或者因为没有明显的原因而无法工作,例如当我这样做时

function(Ui::MainWindow *ui)
{     
copy = ui; // copy is a pointer declared as Ui::MainWindow *copy in the dialog class
}

我尝试了这个,所以我可以从对话框类中的复制指针关闭主窗口,虽然它为此编译,但是当我尝试在该类的另一个函数中使用它时,它不会编译,即使它是一个类变量。之后我意识到我应该能够从main函数连接这两个函数。我写了这个

QObject::connect(&i, SIGNAL(on_passInput_returnPressed()), &w, SLOT(initalizer()));

以上编译但是在调试时我发现它永远不会执行并且不确定为什么尽管SIGNAL on_passInput_returnPressed()实际上在类头中声明为slot。如果这就是为什么它没有被执行的原因如何将对话框类中的插槽连接到MainWindow类的常规函数​​?必须有一种方法,因为我花了一天时间实际考虑这种不停,并且考虑到对象范围的性质(在OOP中)除了我想到的指针之外的事物之外不能想到任何其他方式没有工作。

此外,我刚刚从上面描述的指针中重新创建了错误。

error: invalid use of incomplete type 'class Ui::MainWindow'
 copy->close();
     ^

此错误再次指的是尝试通过复制指针从与另一个函数中的指针赋值相同的类中的另一个函数访问close函数。复制指针在类头中声明如下。如果你想知道,是的,上面写的指针赋值确实会被执行。我通过调试检查了。

private:
    Ui::InitalPrompt *ui;
    Ui::MainWindow *copy;

如果您需要更多信息,请告诉我您的需求,我会用它编辑这篇文章。我非常痴迷地尝试了这么多,我可以这么想,以至于我没有得到进一步的帮助就放弃了,因为Qt对我有多么无情。

此外,如果我正在尝试使用连接功能的新Qt5语法,我可以请给我确切的输入内容,因为尽管我自己研究了这种新语法我不能让它为我的生活编译。 (是的,我使用的是Qt5)这就是为什么上面的代码是用旧式语法编写的。

在回复中添加了以下建议,这是复制指针的类。

#include "initalprompt.h"
#include "ui_initalprompt.h"
#include "mainwindow.h"
#include <QLineEdit>
#include <QCloseEvent>
#include <QMessageBox>

InitalPrompt::InitalPrompt(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::InitalPrompt)
{
    ui->setupUi(this);
}

InitalPrompt::~InitalPrompt()
{
    delete ui;
}

void InitalPrompt::on_passInput_returnPressed()
{
    pass = ui->passInput->text();


}

void InitalPrompt::reject()
{

    QMessageBox::StandardButton resBtn = QMessageBox::Yes;
    bool changes = false;
    if (changes) {
        resBtn = QMessageBox::question( this, "APP_NAME",
                                        tr("Are you sure?\n"),
                                        QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                        QMessageBox::Yes);
    }
    if (resBtn == QMessageBox::Yes) {
        QDialog::reject();

    }
    // the only issue is with the statment below don't know why
    copy->close();
}
 void InitalPrompt::catcher(Ui::MainWindow *ui)
{
    copy = ui;
}

2 个答案:

答案 0 :(得分:0)

“无效使用不完整类型”意味着编译器在到达该行时(尚未)具有该类的定义。在包含您的复制指针的头文件中,在类声明上方包含一个前向声明(该文件看起来有点谎言):

user_list

如果您发布包含*副本的整个类文件,我们可以进一步了解它。

答案 1 :(得分:0)

不,这是不可能的。你可以:

  • 直接从w->initalizer()
  • 致电on_passInput_returnPressed()
  • 在您的ui类中定义信号signal_on_passInput_returnPressed()并从on_passInput_returnPressed()发出该信号。然后

    QObject::connect(&i, SIGNAL(signal_on_passInput_returnPressed()), &w, SLOT(initalizer()));

应该有用。

例如:

class Whatever : 
   public QObject {
   Q_OBJECT

  void on_passInput_returnPressed();

signals:
  void signal_on_passInput_returnPressed();
};

void Whatever::on_passInput_returnPressed() {

   emit signal_on_passInput_returnPressed();
}