gpt4 book ai didi

c++ - 如何从另一个对话框类访问小部件类

转载 作者:太空狗 更新时间:2023-10-29 23:50:53 24 4
gpt4 key购买 nike

首先,我有两个类(class)。第一个类称为 Widget,第二个类称为 addItem
Widget 类是应用程序ui 的主类(主窗口),而addItem 类只是窗口,点击添加人时出现添加新联系人。
Widget 类还有一个名为 tableWidget 的子元素。

enter image description here

现在我在 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;
};

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;
};

编辑

下面的方法属于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();
}

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

addItem.h:

signals:
void mySignal(QString, QString, QString, QString);

Widget.h(主窗口):

private slots:
void addMyItem(QString, QString, QString, QString);

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;
}

最佳答案

设置

public:
Ui::Widget *ui;

不是很好的做法,因此您可以使用 getter 和 setter。

例如,如果你想从QTableWidget中获取文本,例如提供方法

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

设置数据:

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

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

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

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

 emit mySignal(name, address, phone , mobile);

其中 name 是 ui->nameLineEdit->text() 等等。只需从 lineEdit 中获取文本并发送即可。

Widget 类中使用特殊插槽捕获它。在此插槽中,您可以创建新行并设置数据。

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

当然,您应该将 addItem 类中的 mySignal 连接到 Widget 类中的 mySlot

addItem *mDialog = new addItem;
connect(mDialog,SIGNAL(mySignal(QString,QString,QString,QString)),this,SLOT(mySlot(QString,QString,QString,QString)));

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


编辑

详细解释:

你有对话框类和主窗口:

对话框.h:

signals:
void mySignal(QString,QString,QString,QString);

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();
}

主窗口.h

private slots:
void addMyItems(QString,QString,QString,QString);

主窗口.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));
}

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

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();
}

结果:

我点击添加按钮并获得对话框:

enter image description here

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

enter image description here

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

关于c++ - 如何从另一个对话框类访问小部件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com