【问题标题】:QT, C++: How do Signal and Slots works with listWidgetItems?QT、C++:Signal 和 Slots 如何与 listWidgetItems 一起使用?
【发布时间】:2020-01-10 23:10:06
【问题描述】:

我有一个带有复选框的WidgetList,我想将它们用作调用slotTest 函数的信号。

不幸的是,代码不起作用,我找不到解决方案:

connect(ui->listWidget, SIGNAL(item->checkState()), this, SLOT(slotTest()), Qt::QueuedConnection);

这里有更多代码:

 QStringList list;
    list << "CH1 100kHz" << "CH2 100kHz" << "CH3 100kHz";
    model->setStringList(list);
    ui->listView->setModel(model);
    ui->listView->setEditTriggers(QAbstractItemView::AnyKeyPressed | QAbstractItemView::DoubleClicked);
    //ui->listView->setSelectionMode(QAbstractItemView::S)
    ui->listWidget->addItems(list);



    QListWidgetItem* item = 0;
    for(int i = 0; i < ui->listWidget->count(); ++i){
        item = ui->listWidget->item(i);
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
        item->setFlags(item->flags() | Qt::ItemIsEditable);

        item->setCheckState(Qt::Unchecked);
        //connect(ui->listWidget, SIGNAL(itemClicked()), this, SLOT(slotTest()), Qt::QueuedConnection);

        // bool ischeck=ui->listWidget->item(i)->checkState();
        connect(ui->listWidget, SIGNAL(item->checkState()), this, SLOT(slotTest()), Qt::QueuedConnection);

    }

【问题讨论】:

标签: c++ qt signals slots


【解决方案1】:

首先,checkState() 不是信号,因此您无法连接到它。 此外,connect() 调用的第一个参数应该是信号的实际发送者,而不是其父级。

另一种方法是在用户与控件交互时连接到QListWidget 发出的信号之一。您应该对其进行测试,以确定哪一个最适合您的用例。

例如:

QObject::connect(ui->listWidget, &QListWidget::itemChanged, this, &MainWindow::slotTest);
void MainWindow::slotTest(QListWidgetItem *item)
{
    qInfo() << item->checkState();
}

【讨论】:

  • 谢谢,这行得通。我只有一个问题,即所有信号总是以选中或未选中的形式输出。因此,如果我有 100 个信号,则控制台的输出将被选中或取消选中 100 次(所有相同的全部选中或未选中),具体取决于我最后选择的内容
  • 发生这种情况是因为您的 connect 调用位于 for 循环内。只需将其移出即可,因为您只需执行一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多