crossplatform.ru

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

> QTableWidget, Как програмно реализовать перетаскивание?, Типа Drag-n-Drop, но в коде.
Danila_Bagrofff
  опции профиля:
сообщение 16.4.2009, 12:07
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 16.4.2009
Из: Нижний Новгород
Пользователь №: 690

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




Репутация:   0  


Есть проблемка: есть 3 виджета:

QTableWidget *tbl = new QTableWidget(10,10,this);
QFrame *frm = new QFrame(this);
QWidget *wdg = new QWidget(frm);

QHBoxLayout *hbl = new QHBoxLayout(frame);
hbl->insertWidget(wdg);

//затем в процессе программы
hbl->removeWidget(wdg);
wdg->setParent(tbl);
tbl->setCellWidget(0,0, wdg);


в процессе программы wdg должен перемещаться между двумя виджетами. Соответственно менять родителя. Лэаут сам тоже устанавливает виджету родителя. То есть у wgt становится родителем frm после команды insertWidget().
есть команда setParent(). Но при смене родителя она ругается.
Если мы перемещаем wdg возникает ошибка:

Цитата
X Error: BadWindow (invalid Window parameter) 3
Major opcode: 25 (X_SendEvent)
Resourse id: .....


Как тогда правильно перемещать виджет между другими?


-----------
Отделено от темы: Шуточный пример
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 27.4.2009, 17:02
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Вот ответ который я получил
Цитата
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
#include <QtTest/QtTest>
#include <QTreeView>
#include <QStandardItemModel>
#include <QLineEdit>
#include <QApplication>
class Test : public QObject{
      Q_OBJECT

private slots:

      void testSetIndexWidget(){
              QLineEdit *lineEdit = new QLineEdit();
              QTreeView itemView;
              QStandardItemModel model;
              itemView.show();
              model.appendRow(new QStandardItem("an item"));
              itemView.setModel(&model);

              itemView.setIndexWidget(model.index(0,0),lineEdit);
              QApplication::processEvents();

              QVERIFY(itemView.indexWidget(model.index(0,0)));
              QCOMPARE(itemView.indexWidget(model.index(0,0)),lineEdit );

              itemView.setIndexWidget(model.index(0,0),lineEdit);
              QApplication::processEvents();

              QVERIFY(itemView.indexWidget(model.index(0,0)));
              QCOMPARE(itemView.indexWidget(model.index(0,0)),lineEdit );
      }
};

QTEST_MAIN(Test)
#include "test.moc"

testcase.pro
CONFIG+=teambuilder
TEMPLATE = app
TARGET = testcase
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += test.cpp
CONFIG += qt warn_on debug  create_prl link_prl
QT += testlib



Внутри setIndexWidget для lineEdit у нас вызывается deleteLater. Далее делается QApplication::processEvents() для того чтобы deleteLater отработал. Тем не менее удаления не происходит. Я пробовал делать разные тесты, но положительного результата так и не добился. Кто знает в чем проблема? Почему в данном случае deleteLater у нас не отробатывается?


P.S.
Если кому интересно, вот код который я отправил, что бы баг репорт приняли.
Раскрывающийся текст
#include <QtGui/QApplication>
#include <QtGui/QDialog>
#include <QtGui/QTableWidget>
#include <QtGui/QLineEdit>
#include <QtGui/QVBoxLayout>
#include <QtCore/QTimer>

class MyClass : public QDialog {
    Q_OBJECT

private:
    QLineEdit *le;
    QTableWidget *tw;

public:
    MyClass(QWidget *parent = 0) : QDialog(parent) {
        tw = new QTableWidget(5, 5);
        le = new QLineEdit;
        le->setText("lineEdit");

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(tw);
        setLayout(layout);

        QTimer *timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), SLOT(test()));
        timer->start(1000);
    }

public slots:
    void test() {
         tw->setCellWidget(0,0,le);
    }
};

#include "debug/main.moc"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyClass myClass;
    myClass.show();
    return app.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Danila_Bagrofff   QTableWidget, Как програмно реализовать перетаскивание?   16.4.2009, 12:07
- - igor_bogomolov   Тут проблема на самом деле в другом. Дело в том, ...   16.4.2009, 13:44
- - igor_bogomolov   Цитата(Litkevich Yuriy @ 16.4.2009, 15:02...   16.4.2009, 14:11
- - Litkevich Yuriy   igor_bogomolov, тут похоже человеку нужно не прост...   16.4.2009, 14:53
- - igor_bogomolov   Судя по его коду, он делает именно смену родителя....   16.4.2009, 14:56
- - Danila_Bagrofff   Да, я хочу перенести виджет, чтобы не дублировать....   17.4.2009, 7:19
- - igor_bogomolov   Да елы палы. Ты вообще читаешь что тебе отвечают. ...   17.4.2009, 8:20
- - Litkevich Yuriy   Цитата(Danila_Bagrofff @ 17.4.2009, 11:19...   17.4.2009, 9:40
- - igor_bogomolov   Цитата(Litkevich Yuriy @ 17.4.2009, 10:40...   17.4.2009, 10:38
- - Danila_Bagrofff   igor_bogomolov, вы уж извините =) Просто я искал р...   17.4.2009, 12:32
- - igor_bogomolov   По этой теме тоже баг репорт написал. Походу не пр...   22.4.2009, 20:51
- - igor_bogomolov   Привет всем. Сообщением выше я писал, ято отправл...   25.4.2009, 0:07
- - Litkevich Yuriy   Перевод: ЦитатаПривет Игорь, Спсибо за сообщение о...   25.4.2009, 0:54
- - igor_bogomolov   Спасибо, Юрий. Можно еще совет спросить. Я может ...   25.4.2009, 1:01
- - Litkevich Yuriy   Цитата(igor_bogomolov @ 25.4.2009, 5:01) ...   25.4.2009, 2:12
- - igor_bogomolov   Вот ответ который я получил ЦитатаHi Igor, Thanks ...   27.4.2009, 17:02


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


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




RSS Текстовая версия Сейчас: 25.11.2024, 4:57