Qt5 Как сделать, чтобы виджет члена класса не мог быть удален - PullRequest
0 голосов
/ 05 ноября 2018

Я создаю QTabWidget, как вкладки браузера, он содержит QToolButton для добавления вкладки.

Демонстрационное изображение здесь

Я установил эту кнопку как закрытый член QToolButton *addTabButton и инициализировал с помощью открытого метода QToolButton* addTabBtn().

Что я хочу

Моя идея заключается в том, чтобы позволить пользователю api выбирать с помощью кнопки newTab (вызов tabWidget.addTabBtn()), а также настраивать собственную кнопку. Но я не хочу, чтобы пользователь api удалял ее после вызова tabWidget.addTabBtn()

class BrowserTab : public QTabWidget
{
    Q_OBJECT

public:
    explicit BrowserTab(QWidget *parent = nullptr);
    ~BrowserTab();
    QToolButton* addTabBtn();

signals:
    void addTabClicked(); //see addTabBtn() fun

private:
    /*Child Widgets*/
    QToolButton *addTabButton;
};

BrowserTab::BrowserTab(QWidget *parent):
    QTabWidget (parent)
{
    addTabButton = nullptr;
   //initialize other things...
}

QToolButton* BrowserTab::addTabBtn()
{
    /*Initial "addTabButton" and return pointer*/
    if(addTabButton == nullptr)
    {
        addTabButton = new QToolButton(this);
        addTabButton->setText("+");
        addTabButton->setShortcut(QKeySequence::AddTab);
        addTabButton->setAutoRaise(true);
        connect(addTabButton,&QToolButton::clicked,this,&BrowserTab::addTabClicked);
        setCornerWidget(addTabButton,Qt::TopRightCorner);
    }
    return addTabButton;
}

Проблема

Я обнаружил, что есть проблема, когда я делаю это:

tabwidget = new BrowserTab(this);
tabwidget->addTab(new QLabel("some content",tabwidget),
                  QString("Loooooooooooooooooong Title"));
tabwidget->addTabBtn();
/* connect signal/slot to button... */

/*Error usage*/
QToolButton *button = tabwidget->addTabBtn();
delete button;

Это причина ошибки сегментации. Есть ли способ предотвратить удаление пользователем кнопки после кнопки инициализации? Может быть, вернуть ссылку кнопки?


PS: Мой английский довольно ограничен, извините за неудобства.


Другая информация:

Операционная система: Win7 32bit
QT Kit: DeskTop Qt5.11.1 MinGw 32bit
Repo: https://github.com/Loukei/Demo-Test

1 Ответ

0 голосов
/ 05 ноября 2018

Но я не хочу, чтобы пользователь API удалял его после вызова

Это просто: спрятать деструктор, сделав его приватным, и попросите класс подружиться с любым кодом, необходимым для его удаления. Да, вам придется извлечь из класса, и нарезка становится проблемой. Вообще говоря, вы можете подтолкнуть своих пользователей к тому, чтобы они ничего не делали: C ++ не предназначен для установки барьеров безопасности между провайдером API и потребителем API: потребитель API может действительно делать все, что он хочет, если он знает, что он делает.

Обычно в Qt, если API не упоминает, что указатель QObject передает владение, любые указатели объектов, которые вы получаете, обычно не могут быть удалены вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...