c++ - 从另一个类访问 QTableWidget 的数据

标签 c++ qt qtablewidget

我有一个子部件(它是我的 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() 时出现读取访问错误:

主窗口.cpp:

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

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

因以下原因在线程 0 中停止:异常发生在 0x64098ffa,代码:0xc0000005:读取访问冲突发生在:0x0,标志 = 0x0(第一次机会)。

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

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

最佳答案

tableWidget 应该是私有(private)的。当我们用 Qt Designer 编写应用程序时,我们总是在私有(private)部分使用我们的 ui,因为如果我们将它作为公共(public)部分使用,我们就会遇到问题。我们应该把这些东西分开。 tableWidget 应该是私有(private)的,但我们应该提供一些公共(public)方法来做我们想做的事情。我认为您可以使用 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

在.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";
}

关于c++ - 从另一个类访问 QTableWidget 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872862/

相关文章:

python - 从数组动态设置 QTableWidget 的内容

c++ - 如何为 QTableWidget 添加自动完成

python - 仅通过单击行标题选择 QTableWidget 行

c++ - 防止内存泄漏 C++

javascript - QML 鼠标在 MouseArea 中的绝对位置

c++ - Qt5.5静态构建在ubuntu14上找不到-IGL

c++ - 如何将 cv::mat header 和数据部分转换为单个 qbytearray?

c++ - 从迭代器调用的 .value() 导致 Appcrash

c++ - CUDA 推力 : copy from device to device

c++ - 强制在基类之前构造成员变量