如何从另一个对话框类访问窗口小部件类

Lio*_*ing 2 c++ user-interface qt class qt5

首先,我有两节课.调用First类,调用Widget第二个类addItem.
Widget类是main class(main window)应用程序的用户界面,但addItem类只是窗口,当点击添加人添加新的联系人出现.
另外,Widget类有一个叫做子元素tableWidget .

在此输入图像描述

现在我在addItem课堂上, 如何访问tableWidget孩子跟随Widget上课的元素?

小部件类(.h)

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
    void resizeEvent(QResizeEvent *event);

private slots:
    void on_delete_btn_clicked();   
    void on_add_btn_clicked();

private:
    Ui::Widget *ui;
};
Run Code Online (Sandbox Code Playgroud)

addItem类(.h)

namespace Ui {
    class addItem;
}

class addItem : public QDialog
{
    Q_OBJECT

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

private slots:
    void on_addBtn_clicked();

private:
    Ui::addItem *ui;
};
Run Code Online (Sandbox Code Playgroud)

编辑

以下方法属于addItem类.

addItem.cpp:

void addItem::on_addBtn_clicked(){
    emit mySignal(ui->name_txt->text(), ui->address_txt->text(), ui->phoneNum_txt->text(), ui->mobileNum_txt->text());
    Widget *widget = new Widget;
    connect(this, SIGNAL(mySignal(QString,QString,QString,QString)), widget, SLOT(addMyItem(QString,QString,QString,QString)));
    this->close();
}
Run Code Online (Sandbox Code Playgroud)

另请参阅我编写的其余代码:

addItem.h:

signals:
    void mySignal(QString, QString, QString, QString);
Run Code Online (Sandbox Code Playgroud)

Widget.h(主窗口):

private slots:
    void addMyItem(QString, QString, QString, QString);
Run Code Online (Sandbox Code Playgroud)

Widget.cpp(主窗口):

void Widget::addMyItem(QString name, QString address, QString phone_number, QString mobile_number){
    qDebug() << name << "\n" << address << "\n" << phone_number << "\n" << mobile_number;
}
Run Code Online (Sandbox Code Playgroud)

Che*_*byl 8

设置

public:
    Ui::Widget *ui;
Run Code Online (Sandbox Code Playgroud)

这不是一个好习惯,所以你可以使用getter和setter.

例如,如果要从中获取文本QTableWidget,请提供方法

QString Widget::getCellData(int row, int col)
{
    return ui->tableWidget->item(row,col)->text();
}
Run Code Online (Sandbox Code Playgroud)

设置数据:

void Widget::setCellData(int row, int col, QString txt)
{
    //create item if you need
    ui->tableWidget->item(row,col)->setText(txt);
}
Run Code Online (Sandbox Code Playgroud)

等等.我希望你能理解主要思想以及如何去做.

但你也可以使用信号和插槽:

例如,用户点击添加按钮,你想在表中添加新数据,然后从addItem按钮信号发出:

 emit mySignal(name, address, phone , mobile);
Run Code Online (Sandbox Code Playgroud)

名称是ui->nameLineEdit->text()等等.只需从lineEdit中获取文本并发送即可.

Widget课堂上使用特殊插槽抓住它.在此插槽中,您可以创建新行和设置数据.

void Widget::mySlot(QString name,QString address,QString phone ,QString mobile)
{
    //create cells and set data in it
}
Run Code Online (Sandbox Code Playgroud)

当然,你应该连接mySignaladdItemmySlot中的Widget类.

addItem *mDialog = new addItem;
connect(mDialog,SIGNAL(mySignal(QString,QString,QString,QString)),this,SLOT(mySlot(QString,QString,QString,QString)));
Run Code Online (Sandbox Code Playgroud)

结论:我认为,你应该使用信号和插槽.


编辑

详细说明:

你有Dialog类和mainwindow:

dialog.h:

signals:
    void mySignal(QString,QString,QString,QString);
Run Code Online (Sandbox Code Playgroud)

dialog.cpp当用户点击我们获取数据时,发出信号并关闭对话框.

void Dialog::on_addItemButton_clicked()
{
    emit mySignal(ui->lineEdit_2->text(),ui->lineEdit_3->text(),ui->lineEdit_4->text(),ui->lineEdit_5->text());
    this->close();
}
Run Code Online (Sandbox Code Playgroud)

mainwindow.h

private slots:
      void addMyItems(QString,QString,QString,QString);
Run Code Online (Sandbox Code Playgroud)

mainwindow.cpp

void MainWindow::addMyItems(QString name,QString address,QString phone ,QString mobile)
{
    ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);//increase row count by 1

    int row = ui->tableWidget->rowCount() - 1;

    //set all data in cells
    ui->tableWidget->setItem(row,0,new QTableWidgetItem(name));
    ui->tableWidget->setItem(row,1,new QTableWidgetItem(address));
    ui->tableWidget->setItem(row,2,new QTableWidgetItem(phone));
    ui->tableWidget->setItem(row,3,new QTableWidgetItem(mobile));
}
Run Code Online (Sandbox Code Playgroud)

主窗口中的按钮插槽,打开对话框:

void MainWindow::on_Add_clicked()
{
    Dialog *dia = new Dialog;//our dialog
    dia->setAttribute(Qt::WA_DeleteOnClose);//we don't want memory leak
    //connection
    connect(dia,SIGNAL(mySignal(QString,QString,QString,QString)),this,SLOT(addMyItems(QString,QString,QString,QString)));
    dia->setModal(true);//you can use modal window instead of exe()
    dia->show();
}
Run Code Online (Sandbox Code Playgroud)

结果:

我点击了Add按钮并进入对话框:

在此输入图像描述

现在我设置一些数据并单击Additem按钮:

在此输入图像描述

如您所见,我们的连接正常工作,数据正确放置在tableWidget中.