Работа с QTabWidget



  • Добрый день
    Делаю простенькую программку и использую в ней QTabWidget компонент. Хочу динаически создавать и удалять табы. Подскажите как можно закрывать таб?
    С помощью setTabsClosable() добавил кнопки, но как теперь на эти кнопки повесить сигнал и слот?



  • Здравствуйте.
    Возможно, существуют более изящные и правильные решения, но лично я использую следующий код:
    @
    class Document_Tab_Widget : public QTabWidget
    {
    Q_OBJECT
    public:
    explicit Document_Tab_Widget(QWidget *parent = 0);
    public slots:
    void close_requested_tab (int tab_index);
    };

    Document_Tab_Widget::Document_Tab_Widget(QWidget *parent) :
    QTabWidget(parent) {
    connect (this,
    SIGNAL (tabCloseRequested (int)),
    this,
    SLOT (close_requested_tab (int)));
    }

    void Document_Tab_Widget::close_requested_tab(int index) {
    QWidget *d = widget(index);
    this ->removeTab (index);
    delete(d);
    }
    @



  • Спасибо за помощь
    а что происходит в этой строчке
    @QWidget *d = widget(index);@



  • В этой строчке мы берём указатель на удаляемый виджет-вкладку. Это необходимо, чтобы потом мы могли корректно отцепить виджет при помощи removeTab и корректно же отцепленный виджет удалить.
    Как сделать лучше я не знаю.



  • ага... тогда это же можно записать как
    @this ->removeTab (index);
    delete this->widget(index);@
    ну это не столь важно.
    у меня возникает проблема при удалении, по какой то причине удаляется не только вкладка которую я хочу удалить, но и следующие за ней, как будет то удаление происходит в цикле.
    Например, у меня есть 5 вкладок, я удаляю третью, а вслед за ней удаляются четвертя и пятая. Почему такое происходит я немогу понять.
    У Вас была подобная проблема?



  • Вот именно поэтому и вводится переменная d - чтобы правильно всё удалить. Ваш же код отцепляет вкладку с указанным индексом (не удаляя её), при этом индексы остальных вкладок перестраиваются. И на место удалённой вкладки встаёт следующая за ней.
    Однако улучшить код можно:
    @
    void Document_Tab_Widget::close_requested_tab(int index) {
    delete(widget(index));
    }
    @



  • согласен, ошибся
    спасибо за помощь :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.