2012-12-09 29 views
1

使用QPointer从另一个不相关的对象访问对象方法有一个奇怪的问题。用于访问对象方法的QPointer

我已经准备了一个小例子来更好地解释它。

我在简单的QDialog中创建了两个QWidget,Widget_A和Widget_B。

我需要从Widget_B访问Widget_A的公共方法:我通过widget_a指向指向QPointer作业的widget_b方法。 Widget_A包含我想从Widget_B中清除的QLineEdit

问题是当点击pushButton_B时lineEdit_A没有任何事情发生。控制台不显示任何问题,所以最明显的原因是Widget_B正在处理不同的Widget_A对象,而不是我通过的那个对象。

我也创建了一个从QWidget_A到QWidget_B的连接,所以当编辑lineEdit_A时,label_B文本会相应地改变:这是有效的。

在问之前,我需要一个QPointer,因为在我的真实项目中,Widget_A可以被删除。你能解释我错在哪里吗?我应该选择不同的方式吗?谢谢。按照一些片段

widget_a.h

class Widget_A : public QWidget 
{ 
    Q_OBJECT 

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

    void clearLineEdit_A(); 

signals: 
    void lineEdit_A_changed(const QString &); 

private slots: 
    void on_lineEdit_A_textChanged(const QString &arg1); 

private: 
    Ui::Widget_A *ui; 
}; 

widget_a.cpp

Widget_A::Widget_A(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget_A) 
{ 
    ui->setupUi(this); 
    ui->lineEdit_A->setText("write something here..."); 
    ui->lineEdit_A->selectAll(); 
} 

Widget_A::~Widget_A() 
{ 
    delete ui; 
} 

void Widget_A::clearLineEdit_A() 
{ 
    ui->lineEdit_A->clear(); 
} 

void Widget_A::on_lineEdit_A_textChanged(const QString &arg1) 
{ 
    emit lineEdit_A_changed(arg1); 
} 

widget_b.h

class Widget_B : public QWidget 
{ 
    Q_OBJECT 

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

    void controlWidget(QWidget *w); 

private slots: 
    void changeLabel_B(const QString &text); 

    void on_pushButton_B_clicked(); 

private: 
    Ui::Widget_B *ui; 
    QPointer<QWidget> qPtrWdgt; 
}; 

widget_b.cpp

Widget_B::Widget_B(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget_B) 
{ 
    ui->setupUi(this); 
} 

Widget_B::~Widget_B() 
{ 
    delete ui; 
} 

void Widget_B::controlWidget(QWidget *w) 
{ 
    qPtrWdgt = w; 
    connect(qPtrWdgt, SIGNAL(lineEdit_A_changed(const QString &)), 
        this, SLOT(changeLabel_B(const QString &))); 
} 

void Widget_B::changeLabel_B(const QString &text) 
{ 
    ui->label_B->setText(text); 
} 

void Widget_B::on_pushButton_B_clicked() 
{ 
    Widget_A(qPtrWdgt).clearLineEdit_A(); 
} 

dialog.h

class Dialog : public QDialog 
{ 
    Q_OBJECT 

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

private: 
    Ui::Dialog *ui; 

    Widget_A *widget_a; 
    Widget_B *widget_b; 
}; 

dialog.cpp

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 

    widget_a = new Widget_A(this); 
    widget_b = new Widget_B(this); 
    widget_b->controlWidget(widget_a); 

    QVBoxLayout *mainLayout = new QVBoxLayout(this); 
    mainLayout->addWidget(widget_a); 
    mainLayout->addWidget(widget_b); 
    setLayout(mainLayout); 
} 

回答

0
Widget_A(qPtrWdgt).clearLineEdit_A(); 

这种用u创建一个新的Widget_A唱起构造函数Widget_A(QWidget *),然后调用clearLineEdit_A()就可以了。

如果定义qPtrWdgtQPointer<Widget_A>代替,而且由于QPointer重载operator->,那么你可以使用:

qPtrWdgt->clearLineEdit_A(); 

你需要包括头球Widget_A“在Widget_B头球”太多。

+0

我tryed这种方式,但得到的错误: “类QPointer ”没有名为“clearLineEdit_A” – bullet

+0

最后加工件!很感谢。 – bullet