Автор: kunashir 11.3.2011, 11:08
Создал класс наследника от Layout: он содержит кнопку (PushButton) и поле ввода (LineEdit), а также QHBoxLayout, на котором предыдущие виджеты и располагаются.
Так проблема в том что это дочерние виджеты не занимаю все область Layout'а. А так как класс собираюсь использовать в качестве делегата - в ячейки QTableView это выглядит не очень... Вот собственно вопрос - как заставить внутренние виджеты занимать все доступную область.
Автор: silver47 11.3.2011, 12:02
Цитата(kunashir @ 11.3.2011, 13:08)
Создал класс наследника от Layout: он содержит кнопку (PushButton) и поле ввода (LineEdit), а также QHBoxLayout, на котором предыдущие виджеты и располагаются.
Так проблема в том что это дочерние виджеты не занимаю все область Layout'а. А так как класс собираюсь использовать в качестве делегата - в ячейки QTableView это выглядит не очень... Вот собственно вопрос - как заставить внутренние виджеты занимать все доступную область.
гм. А зачем класс наследовать от Layout? В конце-концов он будет виджетом, может лучше отнаследовать от виджета?
Собсна:
QHBoxLayout *mainLay = new QHBoxLayout(this);
mainLay->addWidget(btn = new QPushButton("SomeText"));
mainLay->addWidget(edit = new QLineEdit);
this->setLayout(mainLay);
Все нормально работает и растягивается на весь размер виджета.
P.S.: Попробуй через запятую указать коэфициент изменения размеров, по-умолчанию он 0, поставь по 1ке.
Автор: kunashir 11.3.2011, 12:51
Цитата(silver47 @ 11.3.2011, 12:02)
QHBoxLayout *mainLay = new QHBoxLayout(this);
mainLay->addWidget(btn = new QPushButton("SomeText"));
mainLay->addWidget(edit = new QLineEdit);
this->setLayout(mainLay);
Все нормально работает и растягивается на весь размер виджета.
P.S.: Попробуй через запятую указать коэфициент изменения размеров, по-умолчанию он 0, поставь по 1ке.
Спасибо, что оперативно ответили.
Я уже решил таким способом:
lineEdit = new QLineEdit (this);
button = new QToolButton (this);
layout = new QHBoxLayout (this);
layout->setMargin(0);
layout->setSpacing(0);
layout->addWidget(lineEdit);
layout->addWidget(button);
button->setSizePolicy (QSizePolicy::Fixed,QSizePolicy::Minimum);
lineEdit->setSizePolicy( QSizePolicy::Preferred,QSizePolicy::Preferred);
Теперь у меня другой вопрос:
Когда этот класс использую как делегат, то когда нажимаешь на кнопку редактирование прекращается и делегат закрывается, а вот если сперва щелкнуть по полю редактирования, то потом уже можно на кнопку нажимать. Как сделать чтобы можно было сразу клацать по кнопке?
Автор: silver47 11.3.2011, 14:14
Цитата(kunashir @ 11.3.2011, 14:51)
Теперь у меня другой вопрос:
Когда этот класс использую как делегат, то когда нажимаешь на кнопку редактирование прекращается и делегат закрывается, а вот если сперва щелкнуть по полю редактирования, то потом уже можно на кнопку нажимать. Как сделать чтобы можно было сразу клацать по кнопке?
А кнопка то что делает? Если требе сначала щёлкнуть по полю ввода, а потом тыкать кнопку, поставьте курсор на поле ввода в конструкторе класса.
lineEdit->setFocus(), но тогда зачем всеже кнопка
Автор: kunashir 11.3.2011, 14:17
Цитата(silver47 @ 11.3.2011, 14:14)
А кнопка то что делает? Если требе сначала щёлкнуть по полю ввода, а потом тыкать кнопку, поставьте курсор на поле ввода в конструкторе класса.
lineEdit->setFocus(), но тогда зачем всеже кнопка
Как раз редактировать поле ввода не надо - в идеале можно только посмотреть что там есть, а кнопка нужна чтобы вызвать другую форму (это хочу использовать для работы с внешними ключами таблицы БД - т.е. по кнопки доступ к таблице ключа).
Автор: silver47 11.3.2011, 14:25
Попробуй в конструкоре класа делегата
lineEdit->setReadOnly(true);
button->setFocus();
Вроде делегат должен отрисовываться нормально.
Автор: kunashir 11.3.2011, 14:29
Цитата(silver47 @ 11.3.2011, 14:25)
Попробуй в конструкоре класа делегата
lineEdit->setReadOnly(true);
button->setFocus();
Вроде делегат должен отрисовываться нормально.
Он то отрисовывается нормально, а вот нажать на кнопку можно только после того как ввод получить LineEdit.
Такое впечатление, что любое клик не по полю ввод расценивается как конец редактирование - закрытие делегата.
Но когда в качестве делегата используется SpinBox, то можно сразу по кнопкам тыкать.
Автор: silver47 11.3.2011, 14:32
Ошибка в делегате. Закройте эту тему и создайте новую в Моделях\Представляниях, но там без полного текста класса делегата делать нечего .
Необходимо по крайней мере переопределить методы:
createEditor
setEditorData
setModelData
updateEditorGeometry
paint