Russian Qt Forum
Ноябрь 25, 2024, 10:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Alignment и Layout  (Прочитано 14812 раз)
Danila_Bagrofff
Гость
« : Апрель 13, 2009, 09:06 »

Смысл в следующем.

Есть виджет. Пусть фрэйм. На нем нужно разместить 2 лэйаута, но выравнивание нужно сделать влево. Делаю сначала вертикальный лэаут, в него впихиваю 2 горизонтальных.
Так какое бы вы равнивание я бы для горизонтальных лэаутов не выставлял, они только центрируют... Почему они не могут сделать нужное мне выравнивание?

Код:
TMyFrame::TMyFrame(QWidget *p) : QFrame(p)
{
     vLayout = new QVBoxLayout(this);
     vLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);

     hTopLayout = new QHBoxLayout();
     hBottomLayout = new QHBoxLayout();
      hTopLayout->setAlignment(Qt::AlignLeft);
     hBottomLayout->setAlignment(Qt::AlignLeft);

     vLayout->addLayout(hTopLayout);
      vLayout->addLayout(hBottomLayout);
}

void TMyFrame::addWidget(QWidget *w)
{
     hTopLayout->addWidget(w);
}

И всегда происходит центрирование( Почему?

сделал без всяких вертикальных лэаутов. просто инициализировав в  конструкторе

hTopLayout = new QHBoxLayout(this);

и добавляю туда виджеты. и все равно выравнивание по центру.

Сделал наследование TMyTable не от фрейма, а от виджета. Эффект тот же.

Кто же не дает мне выставить выравнивание?

пс.  hTopLayout->setAlignment(hTopLayout, Qt::AlignLeft); возвращает false
vLayout->setAlignment(hTopLayout, Qt::AlignLeft); тоже возвращает false

Но ведь все существует...
« Последнее редактирование: Апрель 13, 2009, 10:16 от Danila_Bagrofff » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 13, 2009, 10:15 »

пс.  hTopLayout->setAlignment(hTopLayout, Qt::AlignLeft); возвращает false
vLayout->setAlignment(hTopLayout, Qt::AlignLeft); тоже возвращает false

Но ведь все существует...

Чесно сказать вышеприведенный код непонятен, что кому устанавливается.

Почитай внимательно в каком случае возвращается false:

Цитировать
bool QLayout::setAlignment ( QLayout * l, Qt::Alignment alignment )
Sets the alignment for the layout l to alignment and returns true if l is found in this layout (not including child layouts); otherwise returns false.

Если используешь этот метод, то код у тебя должен выглядеть примерно так:

Код
C++ (Qt)
QVBoxLayout *mainLayout = new QVBoxLayout(this);
 
QHBoxLayout *topLayout = new QHBoxLayout();
QHBoxLayout *bottomLayout = new QHBoxLayout();
 
mainLayout->addLayout(topLayout);
mainLayout->addLayout(bottomLayout);
mainLayout->setAlignment(topLayout, Qt::AlignLeft);
mainLayout->setAlignment(bottomLayout, Qt::AlignLeft);
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Danila_Bagrofff
Гость
« Ответ #2 : Апрель 13, 2009, 10:25 »

Цитировать
Код
C++ (Qt)
QVBoxLayout *mainLayout = new QVBoxLayout(this);
 
QHBoxLayout *topLayout = new QHBoxLayout();
QHBoxLayout *bottomLayout = new QHBoxLayout();
 
mainLayout->addLayout(topLayout);
mainLayout->addLayout(bottomLayout);
mainLayout->setAlignment(topLayout, Qt::AlignLeft);
mainLayout->setAlignment(bottomLayout, Qt::AlignLeft);

во-первых, я же написал, что использую так:
hTopLayout->setAlignment(Qt::AlignLeft);
Так тоже можно.

Во-вторых, mainLayout, который вы написали и есть vLayout у меня.
И вызов vLayout->addLayout(hTopLayout); аналогичен вашему.

А вот почему vLayout->setAlignment(hTopLayout, Qt::AlignLeft); возвращает false - ?
« Последнее редактирование: Апрель 13, 2009, 10:35 от Danila_Bagrofff » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Апрель 13, 2009, 11:17 »

А вот почему vLayout->setAlignment(hTopLayout, Qt::AlignLeft); возвращает false - ?

Покажите полный код, где учавствует этот вызов
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Danila_Bagrofff
Гость
« Ответ #4 : Апрель 13, 2009, 12:07 »

Код:
class TMainDialog : public QMainWindow
{
Q_OBJECT
public:
TMainDialog(
QWidget *parent = NULL
   );

private:
TMainWidget *MWgt_mainWidget;
};
//===================================================================================================
class TMainWidget : public QWidget
{
Q_OBJECT
public:
TMainWidget(
QWidget *parent = NULL
   );
private:
QVBoxLayout *qVBL_MainLayout;
TTableWidgetDrop *TWD_DataTable;
TFrameAbonent *TFr_Icons;
};
//===================================================================================================
class TFrameAbonent : public QFrame
{
Q_OBJECT
public:
TFrameAbonent(
QWidget *parent = NULL
     );
bool addAbonent(
int captionNum,
int type
       );
bool clearAllAbonents();
bool showAbonent(
int num
);
public slots:
bool hideAbonent(
QString caption
);
private:
void updateLayout();
QList<TWidgetImage*> qLst_WidgetImage;
QHBoxLayout *qHBL_topLayout;
QHBoxLayout *qHBL_bottomLayout;
QVBoxLayout *qVBL_layout;
};
//===================================================================================================
TMainDialog::TMainDialog(QWidget *parent) : QMainWindow(parent)
{
QDesktopWidget dw;
resize(dw.screenGeometry().width()/2, dw.screenGeometry().height()/2);

MWgt_mainWidget = new TMainWidget(this);
MWgt_mainWidget->resize(width(), height());
setCentralWidget(MWgt_mainWidget);
}
//===================================================================================================
TMainWidget::TMainWidget(
QWidget *parent
) : QWidget(parent)
{
qVBL_MainLayout = new QVBoxLayout(this);
qVBL_MainLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);

//TWD_DataTable = new TTableWidgetDrop(MAX_TLK, MAX_TLK_ABONENT+1, this);
//TWD_DataTable->setMinimumSize(580, 310);

TFr_Icons = new TFrameAbonent(this);
TFr_Icons->setMinimumSize(580, 170);
TFr_Icons->setFrameStyle(QFrame::Panel | QFrame::Raised);

qVBL_MainLayout->addWidget(TWD_DataTable);
qVBL_MainLayout->addWidget(TFr_Icons);

for(int i=9998; i <10020; i++)
{
TFr_Icons->addAbonent(i, AIR);
}


//TWD_DataTable->addTLKNet(0, R098, 0, 1, NORMAL, R805, 4, NORMAL);
//TWD_DataTable->addTLKNet(2, KROSS, 2, 4, FAILED, BEKAS, 3, SELECTED);
//connect(TWD_DataTable, SIGNAL(hideAbonent(QString)), TFr_Icons, SLOT(hideAbonent(QString)));
}
//===================================================================================================
TFrameAbonent::TFrameAbonent(
QWidget *parent
    ) : QFrame(parent)
{
qVBL_layout = new QVBoxLayout(this);
qVBL_layout->setAlignment(Qt::AlignTop | Qt::AlignLeft);

qHBL_topLayout = new QHBoxLayout();
qHBL_topLayout->setAlignment(Qt::AlignLeft);
qHBL_bottomLayout = new QHBoxLayout();
qHBL_bottomLayout->setAlignment(Qt::AlignRight);


qVBL_layout->addLayout(qHBL_topLayout);
qVBL_layout->addLayout(qHBL_bottomLayout);
qVBL_layout->setAlignment(qHBL_bottomLayout, Qt::AlignLeft);
}
//===================================================================================================
//sort & update
void TFrameAbonent::updateLayout()
{
if(qLst_WidgetImage.count()>MAX_ABONENT/2)
{
int hidden=0;
int visible=0;
for(int i=0; i <qHBL_topLayout->count(); i++)
if(!(qHBL_topLayout->itemAt(i))->widget()->isVisible()) hidden++;

int currentVisible = qHBL_topLayout->count()-hidden;
qWarning("hidden = %d, currentVisible = %d", hidden, currentVisible);
if(currentVisible<MAX_ABONENT/2)
{
for(int i=0; i <qHBL_bottomLayout->count(); i++)
{
TWidgetImage* wi =(TWidgetImage*)((qHBL_bottomLayout->itemAt(i))->widget());
if(wi->isVisible()) visible++;
qHBL_bottomLayout->removeWidget(wi);
qHBL_topLayout->addWidget(wi);
i--;
if(currentVisible + visible == MAX_ABONENT/2) break;
}
qWarning("< vis = %d", visible);
}
else if (currentVisible>MAX_ABONENT/2)
{
qWarning(">");
for(int i=qHBL_topLayout->count(); i>=0; i--)
{
TWidgetImage* wi =(TWidgetImage*)((qHBL_topLayout->itemAt(i))->widget());
if(wi->isVisible()) visible++;
qHBL_topLayout->removeWidget(wi);
qHBL_bottomLayout->addWidget(wi);
i--;
if(currentVisible-visible == MAX_ABONENT/2) break;
}
}
}
}
//===================================================================================================
bool TFrameAbonent::addAbonent(
int captionNum,
int type
)
{
if(qLst_WidgetImage.count()+1>MAX_ABONENT)
return false;

QString str;
str.setNum(captionNum);
qLst_WidgetImage.append( new TWidgetImageMove(ABN, type, -1, str.left(NUM_TEXT_ABN), str.mid(NUM_TEXT_ABN), this));

if(qLst_WidgetImage.count()<=MAX_ABONENT/2)
qHBL_topLayout->addWidget(qLst_WidgetImage[qLst_WidgetImage.count()-1]);//, row, column);
else
qHBL_bottomLayout->addWidget(qLst_WidgetImage[qLst_WidgetImage.count()-1]);//, row, column);

return true;
}
//===================================================================================================
bool TFrameAbonent::showAbonent(
int num
       )
{
if(num<0 || num>qLst_WidgetImage.count())
return false;

if(qLst_WidgetImage[num]->isVisible())
return false;

qLst_WidgetImage[num]->show();
updateLayout();
return true;
}

« Последнее редактирование: Апрель 13, 2009, 12:31 от Danila_Bagrofff » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Апрель 13, 2009, 12:58 »

предлагаю пользоваться QSpacerItem - имхо надежнее.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Danila_Bagrofff
Гость
« Ответ #6 : Апрель 13, 2009, 13:03 »

спэйсер - это, конечно, хорошо. Но где трабла здесь?
Записан
Danila_Bagrofff
Гость
« Ответ #7 : Апрель 14, 2009, 09:39 »

здесь: http://www.prog.org.ru/topic_9185_0.html в теме я выложил исходник кода. Трабла в том, что не работает выравнивание на нижней панели элементов в лево, только в центр.

Можете посмотреть, помочь?
Записан
Danila_Bagrofff
Гость
« Ответ #8 : Апрель 14, 2009, 14:03 »

Заработало!

Использовал insertWidget(-1, myWidget, 0, Qt::AlignLeft).

Всем спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.