gpt4 book ai didi

c++ - 是否可以将一个类的插槽或常规函数连接到另一个类的插槽或常规函数? (QT)

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:57 26 4
gpt4 key购买 nike

具体到我的问题,我一直在尝试将一个插槽从一个类连接到另一个类的常规函数​​。我正在尝试这样做,以便我可以从对话框窗口关闭一个主窗口的用户界面。我尝试了我可能想到的所有方法,但似乎每次我想到要尝试的东西时,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() 实际上在类头中被声明为插槽。如果这是它没有被执行的原因,我该如何将对话框类中的插槽连接到 MainWindow 类中的常规函数​​?一定有办法,因为我花了一天时间不停地思考这个问题,并且考虑到对象范围(在 OOP 中)的性质,除了我想到的指针没有这个事实之外,我想不出任何其他方法。不工作。

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

error: invalid use of incomplete type 'class Ui::MainWindow'
copy->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;
}

最佳答案

“不完整类型的无效使用”意味着编译器在到达该行时(还)没有该类的定义。在包含复制指针的头文件中,在类声明上方包含前向声明(该文件看起来像这样):

#ifndef BLAH_BLAH_H
#define BLAH_BLAH_H

/*All of your normal #includes here*/

namespace Ui {
class InitialPrompt;
class MainWindow; //Note the forward declaration here
}

#include "mainwindow.h"

class BlahBlah
{
/*Class stuff here*/
private:
Ui::InitalPrompt *ui;
Ui::MainWindow *copy;
};

#endif //BLAH_BLAH_H

如果您发布包含 *copy 的整个类文件,我们可以进一步调查。

关于c++ - 是否可以将一个类的插槽或常规函数连接到另一个类的插槽或常规函数? (QT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com