如何处理Qt中不同类的信号和时隙
我的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项目示例- 对于那些希望直接查看代码的人,我将提取其中的一些代码:如何处理Qt中不同类的信号和时隙,qt,Qt,我的UI如下图所示: 在主窗口内,有一个大的红色QStackedWidget区域,我将使用它来放置不同的定制StackedWidget,当前StackedWidget1有三个CardWidget,(StackedWidget和CardWidget都是cpp类),在每个CardWidget内,有一个按钮,我要做的是单击CardWidget的按钮按钮,CardWidget向MainWindow发送信号,然后MainWindow从当前stackedwidget切换到另一个自定义stackedwidge
# 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)));
}