首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于访问对象方法的QPointer

用于访问对象方法的QPointer
EN

Stack Overflow用户
提问于 2012-12-09 11:26:50
回答 1查看 805关注 0票数 1

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

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

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

我需要从Widget_B访问widget_a的一个公共方法:我将widget_a指针传递到widget_b用于QPointer分配的方法。Widget_A包含一个QLineEdit,我想从Widget_B中清除它。

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

我还创建了一个从QWidget_A到QWidget_B的连接,因此在编辑lineEdit_A时,label_B文本会相应更改:这是可行的。

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

widget_a.h

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2012-12-09 11:48:55

代码语言:javascript
复制
Widget_A(qPtrWdgt).clearLineEdit_A();

这通过使用Widget_A构造函数创建一个新的Widget_A(QWidget *),然后在它上调用clearLineEdit_A()

如果将qPtrWdgt定义为QPointer<Widget_A>,并且由于QPointer重载了operator->,则可以使用:

代码语言:javascript
复制
qPtrWdgt->clearLineEdit_A();

您还需要将Widget_A的标题包含在Widget_B的标题中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13786967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档