LINUX.ORG.RU

[qt][императивщина][НЕНАВИСТЬ] долбаный репарентинг

 ,


0

1
object Test extends Application {
	QApplication.initialize( Array() )
	val area = new QScrollArea
	// работает
	val w = new QWidget
	w.setLayout( new QVBoxLayout {
		addWidget( new QLabel( "1" ) )
		addWidget( new QLabel( "2" ) )
	} )
	
	//не работает!
	val w = new QWidget
	area.setWidget( w )
	w.setLayout( new QVBoxLayout {
		addWidget( new QLabel( "1" ) )
		addWidget( new QLabel( "2" ) )
	} )
	
        //не работает!!!
	val w = new QWidget
	val layout = new QVBoxLayout
	w.setLayout( layout )
	area.setWidget( w )
	layout.addWidget( new QLabel( "1" ) )
	layout.addWidget( new QLabel( "2" ) )

        //казлыуродыненавижу

	area.resize( new QSize( 500, 500 ) )
	area.show
	QApplication.exec
}

как выяснилось проблемы в скрытом репарентинге который осуществляет setWidget. Компилится. Запускается. Не падает. Не ругается. НЕ РАБОТАЕТ. Писал сходу сложный компонент - час долбался пока раставил эти репарентовые вызовы как надо. Казлыуродыненавижу. Вот вам императивщина в полный рост.

Копаюсь походу в трольском коде - фикшу багу для джамби - чуть не поседел от ужоса. В чтениях потока создание буферов в каждом проходе цикла. Попытка буферизировать то что и без них буферизировано в каждой обертке - изза этого перерасход памяти и ненужные тормоза на ио блокировках «чтобы догнать буфер». Неправильное пользование метода available - изза этого неправильный детект конца потока - работает на честом слове потому что поток файловый. Какието подвешенные буферизированные ридеры которые нигде не используются но создаются - а чтение осуществляется из параллельного стрима - работает только потому что ни один использованый буфер не читает апфронт. В корне неверная работа с класлоадерами в ресурсах - изза этого почти нихрена не работает кроме примитивного случая с джарником.

Мои кеды держатся на честном слове!!!

Ужос!

★★★★★
Ответ на: комментарий от nu11

> но главное оно растягивается как тебе нужно.

Не - оно растягивается на всю арею а не по только по горизонтали. Если ты положишь туда 1 лабел - его раздерет на всю арею. Скролинг не работает. Это первое что я пробовал.

r ★★★★★
() автор топика
Ответ на: комментарий от r

>оно растягивается на всю арею а не по только по горизонтали. Если ты положишь туда 1 лабел - его раздерет на всю арею.

man QSizePolicy, все делается как надо. Со скроллом тоже можно разобраться, в дизигнере же работает.

nu11 ★★★★★
()
Ответ на: комментарий от r
object Main {
 def main(args: Array[String])={
  QApplication.initialize(new Array[String](0))
  val w=new QWidget
  w.show
  QApplication.exec
  }
}

Вот этот минимальный пример выдаёт при старте следуюшее:

java.lang.ExceptionInInitializerError: version.properties not found!
с намёком на строку
QApplication.initialize(new Array[String](0))

Как это лечится?

SV0L0CH
()
Ответ на: комментарий от nu11

> man QSizePolicy, все делается как надо.

Во первых сетлейаут вообще нельзя вызывать для ареи.

The child widget must be specified with setWidget()

r ★★★★★
() автор топика
Ответ на: комментарий от SV0L0CH

Как это лечится?

баги #22 и #48. Как только разберусь с #50 - доберусь до них.

А пока надо положить version.properties в доступное системному класслоадеру место. Самій простьой способ - положть jambi в $SCALA/lib

r ★★★★★
() автор топика
Ответ на: комментарий от nu11

>man QSizePolicy, все делается как надо.

Короче это похоже не лечится. В интернетах интерфейсы подобные моему вообще делаются методом «paint» - что довольно смешно. Придется писать свой лайаут.

r ★★★★★
() автор топика
Ответ на: комментарий от r
    QScrollArea *area = new QScrollArea();
    area->setWidgetResizable(true);
    QWidget *areaContent = new QWidget();
    QVBoxLayout *layout2 = new QVBoxLayout(areaContent);
    for(int i = 4; i > 0; --i)
    {
        layout2->addWidget( new QLabel("bla bla bla") );
        layout2->addWidget( new QPushButton( "ololo") );
    }
    layout2->addStretch();
    area->setWidget(areaContent);
    area->show();

не?

chel
()
Ответ на: комментарий от r

>Во первых сетлейаут вообще нельзя вызывать для ареи.

можно, только работает не так как нужно :) Вот так корректно, проверь на 4.7:

    QScrollArea *area = new QScrollArea( this );
    QHBoxLayout *layout1 = new QHBoxLayout;
    QVBoxLayout *layout2 = new QVBoxLayout;
    QLabel *label = new QLabel("bla bla bla");
    label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
    layout2->addWidget( label );
    layout2->addWidget( new QPushButton( "ololo") );
    layout2->addWidget( new QCalendarWidget );
    layout2->addWidget( new QCalendarWidget );
    layout1->addLayout( layout2 );
    QWidget *areaWidget = new QWidget;
    areaWidget->setLayout( layout1 );
    area->setWidget( areaWidget );
    area->setWidgetResizable( true );
    area->resize( QSize(400, 200) );
    area->show();

nu11 ★★★★★
()
Ответ на: комментарий от r

>В интернетах интерфейсы подобные моему вообще делаются методом «paint»

это видимо бывшие делфокодеры, они без гигантских костылей не могут

nu11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.