crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Qvector и QGridLayout
Andrewshkovskii
  опции профиля:
сообщение 5.9.2009, 22:06
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Давненько я здесь не бывал, всем привет!Вот возникла следующая проблема , небольшой примерчик понять не могу :
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QGridLayout *gl;
    QVector <QPushButton*> btnVector;
    QPushButton *btni;
    public slots :
       void addNewBtn();
};
#endif // MAINWINDOW_H


mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    gl = new QGridLayout;
    QPushButton *btn;
    btn = new QPushButton(this);
    btn->setText("add new btn");
    gl->addWidget(btn);
    connect (btn,SIGNAL(clicked()), this, SLOT(addNewBtn()));
}

MainWindow::~MainWindow()
{
}
void MainWindow::addNewBtn()
{
    this->btni = new QPushButton(0);
    this->btnVector.append(this->btni);
    this->btnVector.at(0)->setText("bla");
    this->gl->addWidget(this->btnVector.at(0));
}


Суть вот в чем : захотел я покать в QGridLayout, и решил тыкать в него QPushButton, да не простые, а из вектора. Только вот ничего не вышло из этого, и проблема видимо в моем недопонимании cpp.. в чем проблема ? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 22:23
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 6.9.2009, 2:06) *
this->btnVector.append(this->btni);
this->btnVector.at(0)->setText("bla");
this->gl->addWidget(this->btnVector.at(0));


Цитата
void QVector::append ( const T & value )
Inserts value at the end of the vector.


Понял почему?

и для компоновщика по сетке нужно координаты указывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.9.2009, 22:26
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Не совсем, ну аппенд вставляет переданное ему в конец вектора, я обращаюсь в 0-му элементу, он там , я так понимаю, должен быть после аппенда?Или тут дело в константной ссылке?
Вообще я попробовал обратиться к элементу через QVector::last() - ничего не изменилось

Про то что нужно указывать координаты - я почитал, в данном случае он должен установить новую кнопочку на место старой( написано - что по умолчанию элемент устанавливается в позицию 0 0)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 22:29
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 6.9.2009, 2:26) *
я обращаюсь в 0-му элементу, он там , я так понимаю, должен быть после аппенда?
нет, всякий раз ты обращаешся к одному и тому же виджету (который ты вставил в первый раз), а не вновь добавленному в вектор.
Поэтому неполучится:
Цитата(Andrewshkovskii @ 6.9.2009, 2:26) *
в данном случае он должен установить новую кнопочку на место старой


можешь использовать:
Цитата
void QVector::prepend ( const T & value )
Inserts value at the beginning of the vector.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.9.2009, 22:31
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


2 Litkevich Yuriy смотри вот так

void MainWindow::addNewBtn()
{
    this->btni = new QPushButton(this);
    this->btnVector.append(this->btni);
    this->btnVector.last()->setText("bla");
    this->gl->addWidget(this->btnVector.last(),1,1);
}

Совершенно ничего не изменилось.Что-то я дурак то ли лыжи не едут..

Сообщение отредактировал Andrewshkovskii - 5.9.2009, 22:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 22:36
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 6.9.2009, 2:31) *
Совершенно ничего не изменилось.
а какой результат-то получаешь?

Яб вообще не так сделал:
void MainWindow::addNewBtn()
{
    QPushButton *b = new QPushButton("bla", this);
    this->btnVector.append(b);
    this->gl->addWidget(b,1,1);
}
Причина редактирования: звёздочку забыл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.9.2009, 22:45
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Да никакого результата, мне нужно посмотреть как ведет себя QGridLayout при постоянном добавлении в него элементов. В моем примере никакой элемент почему-то не добавляется.
В твоем примере тоже , так же ничего не происходит. видимо потому-что указатель созданный в слоте уничтожается после завершения работы слота..
Да и потом, если кнопочку показать( QPushButton::show()) , то она покажется, а вот в лейаут ложиться не хочет..

Сообщение отредактировал Andrewshkovskii - 5.9.2009, 22:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 23:03
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 6.9.2009, 2:45) *
видимо потому-что указатель созданный в слоте уничтожается после завершения работы слота
указатель "b" больше и не нужен.

Цитата(Andrewshkovskii @ 6.9.2009, 2:45) *
а вот в лейаут ложиться не хочет..
а как ты это определил. Если по растягиванию окошка, то окошку ты компоновщик не назначил. (this->setLayout())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.9.2009, 23:16
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Ну если только QGridLayout::addWidget его копирует, тогда да, не нужен я думаю. Oh shi~... Вот это я тупанул!простите!!!

Пфф.. Ну про то, что он не ложиться в лейаут я определил визуально - он не появился на виджете.
Хм..изменил QMainWindow на QWidget и все вроде б заработало...странно.

Сообщение отредактировал Andrewshkovskii - 5.9.2009, 23:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 23:39
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 6.9.2009, 3:16) *
QMainWindow на QWidget и все вроде б заработало...странно.
Ха-ха, я туда даже и не посмотрел, иначеб проблему быстрее обнаружили.
Для QMainWindow нужно установить центральный виджет, ну а в него, в свою очередь, компоновщик :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.12.2024, 13:36