【问题标题】:QPointer for accessing object methods用于访问对象方法的 QPointer
【发布时间】:2012-12-09 11:26:50
【问题描述】:

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

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

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

我需要从 Widget_B 访问 Widget_A 的公共方法:我将 widget_a 指针传递给了 widget_b 的方法以进行QPointer 赋值。 Widget_A 包含一个我想从 Widget_B 中清除的QLineEdit

问题是当按下 pushButton_B 时 lineEdit_A 没有任何反应。控制台没有显示任何问题,因此最明显的原因是 Widget_B 正在处理不同的 Widget_A 对象,而不是我通过的那个。

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

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

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

【问题讨论】:

    标签: qt qdialog qpointer


    【解决方案1】:
    Widget_A(qPtrWdgt).clearLineEdit_A();
    

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

    如果您将qPtrWdgt 定义为QPointer&lt;Widget_A&gt;,并且由于QPointer 重载operator-&gt;,那么您可以使用:

    qPtrWdgt->clearLineEdit_A();
    

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

    【讨论】:

    • 我试过这种方式,但得到错误:'class QPointer' has no member named 'clearLineEdit_A'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多