【问题标题】:Accessing QTableWidget's data from another class从另一个类访问 QTableWidget 的数据
【发布时间】:2014-09-16 15:31:53
【问题描述】:

我有一个带有QTableWidget 的子小部件(它是我的MainWindow 的配置对话框)。

panelSettingsDialog.h:

 public:
    explicit PanelSettingsDialog(QWidget *parent = 0);
    ~PanelSettingsDialog();

  public:
     QTableWidget *tableWidget;

  private:
     PanelSettingsDialog *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-&gt;tableWidget-&gt;rowCount() 语句遍历每一行,从我的MainWindow 类中访问这个有用的QTableWidget 信息,但是在尝试使用rowCount() 时出现读取访问错误:

主窗口.cpp:

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

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

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

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

@Chernobyl ,也许你有这个问题的答案。

【问题讨论】:

    标签: c++ qt qtablewidget


    【解决方案1】:

    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
    

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

    【讨论】:

    • 谢谢,是的,这对于 RowCount 来说听起来很正确,但是我有兴趣传达每个单元格的数据(通过 QVector > 之类的东西)或其他东西。你有没有对所有的表格数据做这样的事情?谢谢:)
    • @Rachael 您是想从主窗口中对话框的单元格中获取数据,还是想在此单元格中设置日期?
    • 只获取数据(我使用网格中的属性来实例化 mainWindow 中正确数量的小部件,这些小部件从 tableWidget 的相应行中获取一些值)。向量数组的大小会有所不同。
    • 太棒了。是的,这行得通。我昨天应该更彻底地考虑一下你对我另一个问题的回答。我专注于创建某种数组来重新存储所有数据。
    • @Chernobyl--使用 ui 返回的任何函数(rowcount()、columnCount() 等)时出现读取访问错误...有什么想法吗?当然,我在对话框标题中公开了这些功能。
    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2011-04-03
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多