每当点击一个按钮时,我想让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)
我是否误解了整个信号转发概念?
一如既往,非常感谢。
答案 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);
}
}
至于我关于信号与信号连接如何工作的问题,感谢大家花时间解释这个问题:)