如何处理Qt中不同类的信号和时隙

如何处理Qt中不同类的信号和时隙,qt,Qt,我的UI如下图所示: 在主窗口内,有一个大的红色QStackedWidget区域,我将使用它来放置不同的定制StackedWidget,当前StackedWidget1有三个CardWidget,(StackedWidget和CardWidget都是cpp类),在每个CardWidget内,有一个按钮,我要做的是单击CardWidget的按钮按钮,CardWidget向MainWindow发送信号,然后MainWindow从当前stackedwidget切换到另一个自定义stackedwidge

我的UI如下图所示: 在主窗口内,有一个大的红色QStackedWidget区域,我将使用它来放置不同的定制StackedWidget,当前StackedWidget1有三个CardWidget,(StackedWidget和CardWidget都是cpp类),在每个CardWidget内,有一个按钮,我要做的是单击CardWidget的按钮按钮,CardWidget向MainWindow发送信号,然后MainWindow从当前stackedwidget切换到另一个自定义stackedwidget,同时,该信号将CardWidget中的一些变量传送到新的自定义stackedwidget

现在的问题是,我点击一个按钮后,cardwidget1发出输出信号,主窗口中的插槽功能没有反应。 我找到了一个与我的情况类似的问题,可能正如Eeli K和dheerendra所说,这里mainwindow.cpp中connect(…)中使用的cardwidget sender实例与StackedWidget1.cpp中的cardwidget sender实例不同,因此mainwindow实际上没有收到信号

另外,我在mainwindow.cpp中构造了cardwidget sender实例,但在StackedWidget1.cpp中构造了cardwidget sender实例,其中包含5个参数

我写了一个最小的、可复制的Qt项目示例-

对于那些希望直接查看代码的人,我将提取其中的一些代码:

# mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    stackedwidget1 = new StackedWidget1(ui->stackedWidget);
    ui->stackedWidget->addWidget(stackedwidget1);

    CardWidget* card = new CardWidget();
    bool c_res = connect (card, &CardWidget::open_panel_signal, this, &MainWindow::open_panel);
    qDebug()<<"Connect open_panels signal and slot ? :"<<c_res;

    //If i emit signal from here instead of from cardwidget, it can trigger the slot function, uncomment to see it
//    int dummy_int = 0;
//    QString dummy_string = "abcd";
//    emit card->open_panel_signal(dummy_int, dummy_string);
}

void MainWindow::open_panel(int index, QString text)
{
    qDebug()<<"test text from cardwidget"<<index<<"is"<<text;
    stackedwidget2 = new StackedWidget2(ui->stackedWidget);
    ui->stackedWidget->addWidget(stackedwidget2);
    ui->stackedWidget->setCurrentWidget(stackedwidget2);
}

#mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void open_panel(int index, QString text);

private:
    Ui::MainWindow *ui;
    StackedWidget1* stackedwidget1;
    StackedWidget2* stackedwidget2;
};

# stackedwidget1.cpp
StackedWidget1::StackedWidget1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::StackedWidget1)
{
    ui->setupUi(this);
    for(int col = 0; col< 3; col++){
        CardWidget* card = new CardWidget(this,col);
        ui->tableWidget->setCellWidget(0, col, card);
        ui->tableWidget->update();
    }
}

# cardwidget.cpp
CardWidget::CardWidget(QWidget *parent, int index) :
    QWidget(parent),
    ui(new Ui::CardWidget),
    index_(index)
{
    ui->setupUi(this);
}

void CardWidget::on_pushButton_clicked()
{
    QString text = "text from cardwidget";
    emit open_panel_signal(index_, text);
    qDebug()<<"emit signal from cardwidget"<<index_;
}

# cardwidget.h
class CardWidget : public QWidget
{
     Q_OBJECT

public:
    explicit CardWidget(QWidget *parent = nullptr, int index = 0);
    ~CardWidget();

signals:
    void open_panel_signal(int, QString);

private slots:
    void on_pushButton_clicked();

private:
    Ui::CardWidget *ui;
    int index_;
};

# stackedwidget2.cpp
StackedWidget2::StackedWidget2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::StackedWidget2)
{
    ui->setupUi(this);
}
#mainwindow.cpp
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
,ui(新ui::Main窗口)
{
用户界面->设置用户界面(此);
stackedwidget1=新stackedwidget1(ui->stackedWidget);
ui->stackedWidget->addWidget(stackedwidget1);
CardWidget*卡=新的CardWidget();
bool c_res=connect(卡和卡小部件::打开面板信号,此和主窗口::打开面板);
qDebug()setupUi(此);
}
void CardWidget::在按钮上单击()
{
QString text=“来自cardwidget的文本”;
发出打开面板信号(索引、文本);

qDebug()基本思想应该是:

信号(卡部件)->信号(stackedwidget1)->插槽(主窗口)

您可以遵循一般方法:

主窗口 cardwidget.h cardwidget.cpp stackedwidget1.cpp
与其只是描述你的代码,不如提供一个。好的,明天早上我会做一个最小的可复制的例子,现在是我所在时区的午夜~我熬夜写出来了,请检查上面的链接~你能在这里发布你的代码而不是链接到某个外部下载站点吗?这个例子最好是小而简单,t他用最少的代码看到了这个问题。添加了它,请看一看。哇,它工作了!所以我不能偷懒跳过中产阶级-stackedwidget1。并且用信号连接信号也睁开了我的眼睛。谢谢!
public slots:
    void open_panel(int, QString);
signals:
    void open_panel_signal(int, QString);
void CardWidget::on_pushButton_clicked()
{
    QString text = "text from cardwidget";
    emit open_panel_signal(index_, text);
    qDebug()<<"emit signal from cardwidget"<<index_;
}
signals:
    void open_panel_signal(int, QString);
StackedWidget1::StackedWidget1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::StackedWidget1)
{
    ui->setupUi(this);
    for(int col = 0; col< 3; col++){
        CardWidget* card = new CardWidget(this,col);
        ui->tableWidget->setCellWidget(0, col, card);
        ui->tableWidget->update();
        connect(card,SIGNAL(open_panel_signal(int, QString)),this,SIGNAL(open_panel_signal(int, QString)));
    }
}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    stackedwidget1 = new StackedWidget1(ui->stackedWidget);
    ui->stackedWidget->addWidget(stackedwidget1);

    connect(stackedwidget1,SIGNAL(open_panel_signal(int, QString)),this,SLOT(open_panel(int, QString)));

    
}