![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Danila_Bagrofff |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 14 Регистрация: 16.4.2009 Из: Нижний Новгород Пользователь №: 690 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть проблемка: есть 3 виджета:
в процессе программы wdg должен перемещаться между двумя виджетами. Соответственно менять родителя. Лэаут сам тоже устанавливает виджету родителя. То есть у wgt становится родителем frm после команды insertWidget(). есть команда setParent(). Но при смене родителя она ругается. Если мы перемещаем wdg возникает ошибка: Цитата X Error: BadWindow (invalid Window parameter) 3 Major opcode: 25 (X_SendEvent) Resourse id: ..... Как тогда правильно перемещать виджет между другими? ----------- Отделено от темы: Шуточный пример |
|
|
igor_bogomolov |
![]()
Сообщение
#2
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Тут проблема на самом деле в другом.
Дело в том, что один и тот же виджет перемещается между фреймом и ячейкой таблицы. В таблицу виджет устанавливается через setCellWidget. Если заглянуть в исходники данной функции, докопаемся до следущего кода. Раскрывающийся текст
Обратите внимание на код. Когда вставляется виджет, сначало происходит удаление старого. При этом не происходит никакой проверки. Т.о. образом при повторном вставлении виджета в ячейку, модель ее просто удаляет. Вобщемто недоработка на мой взгляд. Обойти проблему можно, если только каждый раз создавать новый виджет. Что не есть хорошо. ИМХО. Сообщение отредактировал igor_bogomolov - 16.4.2009, 14:50 |
|
|
igor_bogomolov |
![]()
Сообщение
#3
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, тут похоже человеку нужно не простая смена родителя, помоему речь о Перетаскивании, соответственно тему нужно разделять.
|
|
|
igor_bogomolov |
![]()
Сообщение
#5
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Судя по его коду, он делает именно смену родителя. Логику нужно менять, таким образом добиться нужного эфекта не получится.
Но тему разделить наверно стОит ![]() |
|
|
Danila_Bagrofff |
![]()
Сообщение
#6
|
Студент ![]() Группа: Новичок Сообщений: 14 Регистрация: 16.4.2009 Из: Нижний Новгород Пользователь №: 690 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Да, я хочу перенести виджет, чтобы не дублировать.
Сделал очень простой пример: Раскрывающийся текст DMainDialog::DMainDialog(QWidget *parent) : QDialog(parent) { vbl = new QVBoxLayout(this); tbl = new QTableWidget(4,4,this); tbl->setMinimumSize(100,100); tbl2 = new QTableWidget(4,4,this); tbl2->setMinimumSize(100,100); pb = new QPushButton("push", this); vbl->addWidget(tbl); vbl->addWidget(tbl2); vbl->addWidget(pb); lbl = new QLabel("label", this); vbl->addWidget(lbl); connect(pb, SIGNAL(clicked()), SLOT(clickPB())); i =0; } void DMainDialog::clickPB() { i++; if(i%2) tbl->setCellWidget(0,0,lbl); else tbl2->setCellWidget(0,0,lbl); } Если надо, могу скомпиленный вариант дать. Смысл в том, что после пары перемещений лэйбл вообще пропадает!!! И происходит ошибка сегментирования. Это бага Qt? Нужно перед новым размещением создавать дубликат обязательно? |
|
|
igor_bogomolov |
![]()
Сообщение
#7
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Да елы палы. Ты вообще читаешь что тебе отвечают. Я тебе вчера сразу ответил что происходит в данной ситуации.
Обратите внимание на код. Когда вставляется виджет, сначало происходит удаление старого. При этом не происходит никакой проверки. Читай мое сообщение выше.
Т.о. образом при повторном вставлении виджета в ячейку, модель ее просто удаляет. Вобщемто недоработка на мой взгляд. Сообщение отредактировал igor_bogomolov - 17.4.2009, 9:03 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
QTableWidget, предназанчен для довольно примитивных операций над ним. Поэтому он сам удаляет свои элементы Вставка виджета происходит на уровне QAbstractItemView методом setIndexWidget. При этом, данный метод не является виртуальным, и переопределить его не получится.На мой взгляд имеем недоработку(а возможно и баг), т.к. не происходит проверки вставляемого виджета с предыдущим. Предыдущий виджет просто удаляется. Видимо так сделанно из-за того, что копирование виджетов запрещено. Хотя, на мой взгляд, они должны были предусмотреть такую возможность, что бы защититься от лишних ошибок, в результаве повторного вставления одного и того же виджета в ячейку. Это с одной стороны ошибка программиста, но и недоработка библиотеки, в крайнем случае описания данного метода. Так что можно и отрапортовать о баге, посмотрим что ответят. Как считаете, стОит? ИМХО. Сообщение отредактировал igor_bogomolov - 17.4.2009, 11:11 |
|
|
Danila_Bagrofff |
![]()
Сообщение
#10
|
Студент ![]() Группа: Новичок Сообщений: 14 Регистрация: 16.4.2009 Из: Нижний Новгород Пользователь №: 690 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, вы уж извините =) Просто я искал разные пути решения =) И игрался по-всякому, стараясь как-нить обойти =) не получилось.
В итоге, создаю копию нужного мне виджета и уже его размещаю. Увы, видимо, иначе пока сделать нельзя. Спасибо =) И не ругайтесь сильно =) не каждый раз натыкаешься на бажки кутэ =) |
|
|
igor_bogomolov |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
По этой теме тоже баг репорт написал. Походу не приняли. Видимо из-за моего английского, не поняли что я имею ввиду
![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#12
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Привет всем.
Сообщением выше я писал, ято отправлял баг репорт по данной теме. Во какой ответ я получил. Цитата Hi Igor, Thanks for reporting this issue. The code seems to show that this particular case has been omitted, which I agree, could lead to a weird behaviour, even though it is definitely not critical. However, I tried with no luck reproducing the issue, I attached the test I tried with. If you either get a FAIL! with this test case, or can provide me with a little compilable example that reproduces the problem, I could file a bug report for that problem. Моих знаний английского не хватает, что бы до конца понять ответ. Пробовал перевести Google-ом. Они просят что ли написать небольшой тестовый пример воспроизводящий баг? Заранее спасибо за помощь ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Перевод:
Цитата Привет Игорь,
Спсибо за сообщение об этой проблеме. Код, как (мне) кажется, показывает, что этот особый случай был опущен (не принят во внимание), с которым я согласен, может привести к неожиданному поведению, даже несмотря на то, что это некритично. Тем не мение, я пытался безуспешно воспроизвести проблему, я прикрепил тест, который я проводил. Если выполучите FAIL! во время этого теста, или сможете предоставить мне маленький компилируемый пример, который воспроизводит проблему, я могу подать сообщение об ошибке для этой проблемы. |
|
|
igor_bogomolov |
![]()
Сообщение
#14
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо, Юрий.
Можно еще совет спросить. Я может сейчас, может за выходные, накидаю тестовый примерчик. Как дальше поступить, создать новый баг репорт или ответить на полученное письмо, и там прикрепить тест? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#16
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Вот ответ который я получил
Цитата Hi Igor, Thanks for the test. I am not sure yet why I can't reproduce it with my testcase but yours worked. I've created a task for the development team who will look into fixing this for a future release. You can track the status of this entry in the Task Tracker with ID 252253. See: http://www.qtsoftware.com/developer/task-t...y&id=252253 Из переписки встал следущий вопрос. В первом письме от тех поддержки я получил следущий код для проверки бага test.cpp
testcase.pro
Внутри setIndexWidget для lineEdit у нас вызывается deleteLater. Далее делается QApplication::processEvents() для того чтобы deleteLater отработал. Тем не менее удаления не происходит. Я пробовал делать разные тесты, но положительного результата так и не добился. Кто знает в чем проблема? Почему в данном случае deleteLater у нас не отробатывается? P.S. Если кому интересно, вот код который я отправил, что бы баг репорт приняли. Раскрывающийся текст
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 23.6.2025, 15:55 |