从另一个类访问 QTableWidget 的数据

Accessing QTableWidget's data from another class

本文关键字:数据 QTableWidget 访问 另一个      更新时间:2023-10-16

我有一个子部件(它是我的MainWindow的配置对话框),上面有一个QTableWidget

面板设置对话框.h:

 public:
    explicit PanelSettingsDialog(QWidget *parent = 0);
    ~PanelSettingsDialog();
  public:
     QTableWidget *tableWidget;
  private:
     PanelSettingsDialog *panelSettingsDialog;

面板设置对话框.cpp:

 #include "panelsettingsdialog.h"
 #include "ui_panelsettingsdialog.h"
 #include <QCheckBox>

 PanelSettingsDialog::PanelSettingsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::PanelSettingsDialog)
  {
    ui->setupUi(this);
    setWindowTitle("Channel Settings & Panel Configuration");
    tableWidget = new QTableWidget(this);

tableWidget按预期填充(我添加了5个伪数据行)。

现在,我打算通过使用panelSettings->tableWidget->rowCount()语句迭代每一行,从MainWindow类访问这个有用的QTableWidget信息,但在尝试使用rowCount():时会出现读取访问错误

mainwindow.cpp:

 void MainWindow::configure_panels()
 {
     const int totalRowCount = panelSettingsDialog->tableWidget->rowCount();
 }

此处中断,并显示以下错误消息:

在线程0中停止的原因:0x64098ffa处出现异常,代码:0xc0000005:0x0处出现读取访问冲突,flags=0x0(第一次机会)

如果我无法读取另一个子类的小部件项,那么将QTableWidget数据传递给MainWindow以便进行迭代的好方法是什么?

@切尔诺贝利,也许你有答案。

tableWidget应该是私有的。当我们用Qt Designer编写应用程序时,我们总是在私有部分使用ui,因为如果我们将其用作公共部分,我们可能会遇到问题。我们应该把这些东西分开。tableWidget应该是私有的,但我们应该提供一些公共方法,以实现我们想要的功能。我认为你可以使用getter和setter。

例如:

对话框.h

public:
    int getRowCountData();

对话.cpp

    int Dialog::getRowCountData()
    {
        return ui->tableWidget->rowCount();
    }
//... somewhere in constructor
    ui->tableWidget->setColumnCount(1);
    for(int r=0;r<7;r++)
    {
     ui->tableWidget->insertRow(r);
     ui->tableWidget->setCellWidget(r,0,new QCheckBox(QString("checkBox%1").arg(r)));
    }

用法:

void MainWindow::on_newForm_clicked()
{
    Dialog *mDialog = new Dialog;
    mDialog->setModal(true);
    mDialog->show();
    qDebug() << mDialog->getRowCountData();
}

您将看到7。其他事情也是如此。

编辑(相同结构):

QString getCellData(int row,int col);//in header

In.cpp

QString Dialog::getCellData(int row, int col)
{
     QCheckBox* curBox = qobject_cast<QCheckBox*>(ui->tableWidget->cellWidget(row,col));
     if(curBox)
     {
        return curBox->text();
     }
     return QString();
}

用法:

Dialog *mDialog = new Dialog;
mDialog->show();
qDebug() << mDialog->getRowCountData();
for(int r=0;r<7;r++)
{
    QString txt = mDialog->getCellData(r,0);
    if(!txt.isNull())
        qDebug() << txt;
    else
        qDebug() << "fail";
}