代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

如何访问子类中的小部件?

  •  1
  • JokerMartini  · 技术社区  · 6 年前

    我已经创建了 QLineEdit 我在小部件的右侧添加了一个按钮,这样我就可以 一体机 路径浏览控件。但是,我需要从 resizeEvent ,这样我就可以将按钮正确地放置在行编辑的右侧。我得到错误,我假设这是由于我创建按钮的方式。

    enter image description here

    线条编辑路径.h

    #ifndef LINEEDITPATH_H
    #define LINEEDITPATH_H
    
    #include <QLineEdit>
    #include <QFileDialog>
    #include <QPushButton>
    
    class LineEditPath : public QLineEdit
    {
        Q_OBJECT
    public:
        explicit LineEditPath(QWidget *parent = 0);
    
    signals:
    
    public slots:
    
    protected:
        void resizeEvent(QResizeEvent *event) override;
    
    private:
        QFileDialog *dialog;
        QPushButton *button;
    };
    
    #endif // LINEEDITPATH_H
    

    lineedithpath.cpp文件

    #include "lineeditpath.h"
    #include <QLineEdit>
    #include <QPushButton>
    
    LineEditPath::LineEditPath(QWidget *parent) : QLineEdit(parent) {
        setAcceptDrops(true);
    
        auto button = new QPushButton("...", this);
        button->setFixedWidth(30);
        button->setCursor(Qt::CursorShape::PointingHandCursor);
        button->setFocusPolicy(Qt::FocusPolicy::NoFocus);
        setTextMargins(0,0,30,0); }
    
    void LineEditPath::resizeEvent(QResizeEvent *event) {
        QLineEdit::resizeEvent(event);
    
        // Resize the button: ERROR
        button->move(width()-button->sizeHint().width(), 0);
    
    }
    

    错误:

    ---------------------------
    Signal Received
    ---------------------------
    <p>The inferior stopped because it received a signal from the operating system.<p><table><tr><td>Signal name : </td><td>SIGSEGV</td></tr><tr><td>Signal meaning : </td><td>Segmentation fault</td></tr></table>
    ---------------------------
    OK   
    ---------------------------
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   eyllanesc RAHUL KUMAR    6 年前

    auto button = new QPushButton("...", this); 初始化 button 类的成员变量。它创建了一个新的局部变量,该变量的名称与成员变量的名称相同,并且在构造函数体的末尾超出了作用域。您的成员变量从未初始化。

    button = new QPushButton("...", this); -或者更好;将其移到构造函数初始化列表中,而不是使用ctor主体。

    LineEditPath::LineEditPath(QWidget *parent) :
        QLineEdit(parent), 
        button(new QPushButton("...", this)) 
    {
    

    dialog 成员变量。