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)
设置
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)
当然,你应该连接mySignal
从addItem
类mySlot
中的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中.