【问题标题】:QTable and checkbox signal/slotQTable 和复选框信号/槽
【发布时间】:2015-06-26 07:31:51
【问题描述】:

我是 QT 的新手,已经阅读了很多主题,但我就是不明白。我希望有人可以帮助我。

所以,我创建了一个循环,我在 QGroupBoxes 中添加 QTables。表格的第二列用于 QCheckBoxes,第一列用于条件文本,当勾选复选框时,条件文本会发生变化。 一切正常,除了文本不会改变。所以问题应该出在信号上。我就是想不通:(

我会很高兴得到任何帮助:)

    inputBox = new QGroupBox();
    QScrollArea *boxScroll = new QScrollArea();
    QHBoxLayout *boxLayout = new QHBoxLayout();
    boxTable = new QTableWidget();

    inputBox->setLayout(boxLayout);
    boxLayout->addWidget(boxTable);

    boxTable->verticalHeader()->setVisible(false);
    boxTable->setRowCount(24);
    boxTable->setColumnCount(5);
    boxTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    boxTable->setHorizontalHeaderItem(0, new QTableWidgetItem("ID"));
    boxTable->setHorizontalHeaderItem(1, new QTableWidgetItem("State"));
    boxTable->setHorizontalHeaderItem(2, new QTableWidgetItem("Enable"));


    for (int i=0; i<24; i++)
    {
        inCheck = new QCheckBox();
        iCheckLabel = new QLabel();
        QTableWidgetItem *id = new QTableWidgetItem();
        QTableWidgetItem *state = new QTableWidgetItem();
        QTableWidget *checkWidget = new QTableWidget();
        QHBoxLayout *checkLayout = new QHBoxLayout();

        checkLayout->setAlignment(Qt::AlignCenter);
        checkLayout->setContentsMargins(0,0,0,0);
        checkLayout->addWidget(inCheck);

        checkWidget->setLayout(checkLayout);

        id->setText(QString::number(i));
        id->setTextAlignment(Qt::AlignCenter);
        id->setFlags(id->flags() & ~Qt::ItemIsEditable);

        state->setText("Off");
        state->setTextAlignment(Qt::AlignCenter);
        state->setFlags(state->flags() & ~Qt::ItemIsEditable);
        state->setTextColor(Qt::red);

        boxTable->setItem(i, 0, id);
        boxTable->setItem(i, 1, state);
        boxTable->setCellWidget(i, 2, checkWidget);

        connect(checkWidget, SIGNAL(cellChanged(int,int)), this, SIGNAL(inCheckChecked(int, int)));

    }

    inputBox->setMinimumSize(350, 450);
    inputBox->setTitle(title);
    ui->scrollAreaWidgetContents->layout()->addWidget(inputBox);



void Project::inCheckChecked(int row, int col)
{
    QTableWidgetItem *item = boxTable->item(row, col);
    if (item->checkState() == true)
    {
        qDebug("is checked");
    }    
}

【问题讨论】:

    标签: qt checkbox qtablewidget


    【解决方案1】:

    你在这里做了一件很奇怪的事。您为表格小部件设置布局,然后向该布局添加一个复选框,然后将此表格小部件添加到另一个表格小部件。为什么?您可以使用QTableWidget::setItem(int row, int column, QTableWidgetItem * item) 添加一个复选框,就像您将它用于 id 和 state 项目一样。只需使其成为可检查项目。

    for (int i=0; i<24; i++)
    {
        QTableWidgetItem *id = new QTableWidgetItem();
        QTableWidgetItem *state = new QTableWidgetItem();
        QTableWidgetItem *checkItem = new QTableWidgetItem();
        ...
    
        checkItem->setCheckState(Qt::Unchecked); // shuold be enough to make it checkable.. 
        //you can also set the needed flags
    
        boxTable->setItem(i, 0, id);
        boxTable->setItem(i, 1, state);
        boxTable->setItem(i, 2, checkItem);
    }
    

    然后您只需将来自boxTable 的信号连接到您的插槽,当复选框状态更改时它会通知您。

    【讨论】:

      【解决方案2】:

      在这段代码中,下面一行有错误

       connect(checkWidget, SIGNAL(cellChanged(int,int)), this, SIGNAL(inCheckChecked(int, int)));
      

      对于使用connect,根据您的实现,您希望连接一个signal 和一个slot,这会消耗signal。应该如下:

       connect(checkWidget, SIGNAL(cellChanged(int,int)), this, SLOT(inCheckChecked(int, int)));
      

      获取更多关于Signals and Slotshere的信息

      【讨论】:

      • 我的错,忘了把它改回SLOT。我从这里拿了那个qtcentre.org/threads/… 但还是没有运气:(
      • 您可以将信号连接到信号,但在这种情况下它应该是slot,因为Project::inCheckChecked 似乎是一个插槽。这绝对不是信号。
      • @Sweezie: 将qDebug 放入槽中,并在发出signal 时检查它是否被调用
      • 试过了: void Project::inCheckChecked(int row, int col) { qDebug("test"); QTableWidgetItem *item = boxTable->item(row, col); if (item->checkState() == true) { qDebug("已检查"); } } “测试”未显示在应用程序控制台中。所以信号有问题。
      • @Sweezie 您的信号不起作用,因为您从未将任何项目添加到您的 checkWidget
      猜你喜欢
      • 2019-04-20
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2012-01-11
      相关资源
      最近更新 更多