我有一个子窗口小部件(它是MainWindow
的配置对话框),上面有QTableWidget
。
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行虚拟数据)。
现在,我打算通过使用QTableWidget
语句遍历每一行来从我的MainWindow
类访问此有用的panelSettings->tableWidget->rowCount()
信息,但在尝试时遇到读取访问错误使用rowCount()
:
mainwindow.cpp:
void MainWindow::configure_panels()
{
const int totalRowCount = panelSettingsDialog->tableWidget->rowCount();
}
在此处中断,并显示以下错误消息:
在线程0中停止:0x64098ffa处的异常,代码:0xc0000005:读取访问冲突位于:0x0,flags = 0x0(第一次机会)。
如果我无法从另一个子类的窗口小部件项中读取,那么将QTableWidget
数据传递给MainWindow
以便可以迭代它的好方法是什么?
@Chernobyl,也许你可以得到答案。
答案 0 :(得分:1)
tableWidget
应该是私密的。当我们使用Qt Designer编写应用程序时,我们总是在私有部分使用ui
,因为如果我们将其用作公共,我们就会遇到问题。我们应该分开这些事情。 tableWidget应该是私有的,但是我们应该提供一些可以做我们想要的公共方法。我想你可以使用getter和setter。
例如:
dialog.h
public:
int getRowCountData();
dialog.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";
}