Название: Alignment и Layout
Отправлено: 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 Но ведь все существует...
Название: Re: Alignment и Layout
Отправлено: pastor от Апрель 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);
Название: Re: Alignment и Layout
Отправлено: Danila_Bagrofff от Апрель 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 - ?
Название: Re: Alignment и Layout
Отправлено: pastor от Апрель 13, 2009, 11:17
А вот почему vLayout->setAlignment(hTopLayout, Qt::AlignLeft); возвращает false - ?
Покажите полный код, где учавствует этот вызов
Название: Re: Alignment и Layout
Отправлено: Danila_Bagrofff от Апрель 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; }
Название: Re: Alignment и Layout
Отправлено: Racheengel от Апрель 13, 2009, 12:58
предлагаю пользоваться QSpacerItem - имхо надежнее.
Название: Re: Alignment и Layout
Отправлено: Danila_Bagrofff от Апрель 13, 2009, 13:03
спэйсер - это, конечно, хорошо. Но где трабла здесь?
Название: Re: Alignment и Layout
Отправлено: Danila_Bagrofff от Апрель 14, 2009, 09:39
здесь: http://www.prog.org.ru/topic_9185_0.html в теме я выложил исходник кода. Трабла в том, что не работает выравнивание на нижней панели элементов в лево, только в центр.
Можете посмотреть, помочь?
Название: Re: Alignment и Layout
Отправлено: Danila_Bagrofff от Апрель 14, 2009, 14:03
Заработало!
Использовал insertWidget(-1, myWidget, 0, Qt::AlignLeft).
Всем спасибо.
|