用不同的参数连接两个信号

时间:2016-05-20 05:46:34

标签: c++ qt signals-slots

每当点击一个按钮时,我想让QTreeView小部件发出一个点击的(const QModelIndex&)信号。这样我就可以获得在单击按钮时在QTreeView中选择的所有项目的列表。现在我想我可以用不同的参数(Qt Connect signals with different arguments)连接两个信号,但是当我尝试调用

connect(ui.pbAddVideo, SIGNAL(clicked()), ui.treeView_video, SIGNAL(clicked(const QModelIndex&)));

我收到错误消息:

QObject::connect: Incompatible sender/receiver arguments QPushButton::clicked() --> QTreeView::clicked(QModelIndex)

我是否误解了整个信号转发概念?

一如既往,非常感谢。

5 个答案:

答案 0 :(得分:3)

首先,您必须通过点击树中的按钮发送什么索引? 其次,从c ++ 11标准开始,你可以做类似的事情:

connect(ui.pbAddVideo, &QPushButton::clicked, [=] { emit ui.treeView_video->clicked(ui.treeView_video->currentIndex()); });

答案 1 :(得分:1)

我会用以下方法解决您的问题:

首先,你必须处理按钮点击:

connect(ui.pbAddVideo, SIGNAL(clicked()), this, SLOT(onLoadVideo()));

在插槽中,您需要从树状视图中获取所选项目的列表并使用它们执行某些操作:

void MyClass::onLoadVideo()
{
    QItemSelectionModel *selectionModel = ui.treeView_video->selectionModel();
    QModelIndexList selectedVideos = selectionModel->selectedIndexes();
    foreach (QModelIndex *video, selectedVideos) {
        // Play the video.
    }

}

答案 2 :(得分:0)

您正在将一个SIGNAL()连接到另一个SIGNAL(),这完全可以,但它们的参数应该匹配。在你的情况下,第二个信号有一个第一个信号没有的参数(即QModelIndex)。

答案 3 :(得分:0)

  

我是否误解了整个信号转发概念?

当发出信号时,Qt接收信号的参数并将它们传递给连接的时隙/信号。

有效的信号槽连接

例如,假设您将QSlider::valueChanged(int)信号连接到QSpinBox::setValue(int)广告位。当发出valueChanged()信号时,这实际上是调用槽的方式:

// "Emitting a signal" == "Calling the signal function"
QSlider::valueChanged(int sliderSignalValue)
{
    QSpinBox *receiver = findReceiver();
    receiver->setValue(sliderSignalValue);
}

有效的信号 - 信号连接

同样,如果您将QSlider::valueChanged(int)信号连接到QSpinBox::valueChanged(int)信号,则代码的行为如下:

QSlider::valueChanged(int sliderSignalValue)
{
    QSpinBox *receiver = findReceiver();
    emit receiver->valueChanged(sliderSignalValue);
}

现在,如果你想以相反的方向连接(connect(ui.treeView_video, SIGNAL(clicked(const QModelIndex&)), ui.pbAddVideo, SIGNAL(clicked()));,那就完全可以了:

QTreeView::clicked(const QModelIndex& viewSignalValue)
{
    QPushButton *receiver = findReceiver();
    emit receiver->clicked(); // No problem. The viewSignalValue is simply ignored.
}

信号槽连接无效

但是,对于您想要进行的连接,代码需要表现得像这样:

QPushButton::clicked()
{
    QTreeView *receiver = findReceiver();
    emit receiver->clicked(/*???*/); // ERROR: You need to pass a QModelIndex value!
} 

您的参数不匹配。 QTreeView::clicked()需要QModelIndex值,但QPushButton::clicked()无法提供此值。因此,您无法将这两者连接在一起。

这有意义吗?

答案 4 :(得分:0)

非常感谢@vahancho我的回答。使用" clicked()"没有意义。来自qTreeView的信号,因为我不需要等待它来访问里面的数据。因此:

connect(ui.pbAddVideo, SIGNAL(clicked()), this, SLOT(addVideo()));

    void VigilWidget::addVideo() {

    QItemSelectionModel *selectionModel = ui.treeView_video->selectionModel();
    QModelIndexList selectedVideos = selectionModel->selectedIndexes();
    foreach (QModelIndex video, selectedVideos) {
        qDebug().nospace() << video.data(0);
    }

}

至于我关于信号与信号连接如何工作的问题,感谢大家花时间解释这个问题:)