【问题标题】:QWidget through a slot [duplicate]QWidget通过一个插槽[重复]
【发布时间】:2016-06-02 07:56:02
【问题描述】:

我正在尝试创建一个函数,该函数将根据传递给它的 QWidget 显示一个小部件。

我有:

position_widget = new positionWidget();
timing_widget = new timingWidget();
...

void MainWindow::showScreen(QWidget *w)
{
    ui->screenWidget->layout()->addWidget(w);
    w->show();
}


void MainWindow::doConnects()
{
QObject::connect(buttons_widget, SIGNAL(showPositionScreen_signal()), this, SLOT(showScreen(position_screen)));
QObject::connect(buttons_widget, SIGNAL(showTimingScreen_signal()), this, SLOT(showScreen(timing_screen)));
}

当我单击按钮时没有任何反应,它出现“没有这样的插槽 MainWindow::ShowScreen(timing_screen)”

【问题讨论】:

  • 应该是SLOT(showScreen(QWidget *))
  • 使用 Qt Creator 的自动完成功能来完成信号和插槽,尤其是使用 ole 样式连接(使用 SIGNAL 和 SLOT 宏)。如果你弄错了,更喜欢新的风格连接你得到编译错误的地方。
  • @thuga 使用值而不是插槽宏的类型与您指出的问题类似,但他的信号和插槽中的参数不匹配也存在问题
  • @tobilocker 两个问题的参数不匹配。
  • @thuga 在这两种情况下,都会发出不带任何参数的信号,并且尝试连接到具有信号宏中值的插槽。你是对的 - 但我看到了一个区别:在这种情况下,用户想要发出自定义信号,而在另一个问题中,用户想要使用 QAbstractButtonclicked() 信号(我实际上看不到任何用途 -案例)

标签: qt signals signals-slots qwidget qt-signals


【解决方案1】:

如果showScreen 在您的mainwindow.h 中声明为Qt Slot,例如:

private slots:
    void showScreen(QWidget* w);

你的信号在buttons_widget中声明

signals:
    void showPositionScreen_signal(QWidget* w); //Note that signal needs same type as slot
    void showTimingScreen_signal(QWidget* w);

然后您可以将该信号连接到插槽。请注意,信号和槽的参数必须匹配。 即:"The signals and slots mechanism is type safe: The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)"

connect(buttons_widget, SIGNAL(showPositionScreen_signal(QWidget*)), this, SLOT(showScreen(QWidget*)));

你将不得不从buttons_widget 中发出position_screentiming_screen,例如:

emit showPositionScreen_signal(position_screen);

正如 thuga 指出的那样,这就是说您不需要两个不同的信号。要将另一个 QWidget 传递到同一个插槽,只需使用它发出该信号。即:

emit showPositionScreen_signal(timing_screen);

然后我建议将您的信号名称更改为适当的名称。

【讨论】:

  • 为什么要使用两个做同样事情的信号?当您将小部件作为参数传递时,一个就足够了。
  • @thuga 这是真的,好点。以上将起作用,我会在我的回答中指出这一点......谢谢
  • 太好了,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多