QLayout выравнивает виджет как неправильный

У меня есть класс QLayout, который принимает QLabel и выравнивает его как Qt::AlignRight в ячейке. Первоначально я думаю, что он работает (поскольку размер ячейки макета точно равен размеру растрового изображения), у меня есть событие, связанное с QLabel, т.е. когда произошло mousepressEvent размер QLabel увеличивается (размер ячейки также увеличивается, поэтому размер всего столбца увеличивается). В это время другие QLabel в QLayout выравниваются по левому краю, я хочу, чтобы они были выровнены по правому краю или по центру вместо выравнивания по левому краю,

Мой код,

Container::Container()
{ 
    Layout = new QGridLayout;
    Layout->setHorizontalSpacing(0);
    Layout->setVerticalSpacing(10);
    Layout->setMargin(10); 
    for(int i = 0; i < 4; ++i)
    {
        holes[i] = new Hole; 
        Layout->addWidget(ui_holes[i], i, 0, 1, Qt::AlignRight);
        ui_holes[i].setPixmap("mypixmapname.png")
    } 
    Layout->setAlignment(Qt::AlignCenter);
    setLayout(Layout); 
    setMaximumSize(200,760);
    setMinimumSize(200,760);
    setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed);
}

void Screen::mousePressEvent(QMouseEvent *tevent)
{ 
    if(childAt(tevent->pos()))
    { 
        if(childAt(tevent->pos())->objectName() == "Hole")
        { 
            hole = static_cast<Hole *>(childAt(tevent->pos()));  
            hole->resize(QSize(160,160));  
        }
    }  
}  

void Screen::mouseReleaseEvent(QMouseEvent*)
{ 
    if(hole)
    {
        ui_Hole->resetSize();  
    } 
}

Hole — это класс, унаследованный от QLabel, и я создал две новые функции-члена для Hole: resetSize и resize,

void Hole::resize(QSize size)
{
    setSize(size);
    if(!ui_HoleFlags[PIXMAP_EXISTS])
        return  void(0);
    QPixmap *tempPixmap = ui_resourceIcon();
    setPixmap(tempPixmap->scaled(size,Qt::IgnoreAspectRatio));
    delete tempPixmap;
} 

QPixmap* Hole::ui_resourceIcon()
{
    if(!ui_HoleFlags[ICON_EXISTS])
        return NULL;
    QPixmap *tempPixmap = new QPixmap(*pixmap());
    return tempPixmap;
}

void Hole::setSize(QSize size)
{
    setMaximumSize(size);
    setMinimumSize(size);
}

void Hole::resetSize()
{
    if(ui_HoleFlags[PIXMAP_EXISTS])
        setPixmap(*Pixmap);
    setSize(ICON_SIZE);
}

заранее спасибо


person Akhil V Suku    schedule 24.02.2015    source источник


Ответы (1)


Таким образом, вы всегда будете выравнивать метки по центру, независимо от размера отдельных меток.

#include <QLabel>
#include <QApplication>
#include <QLayout>
#include <QMouseEvent>

class Window : public QWidget
{
public:
    Window(QWidget *parent = 0) {}
    virtual ~Window() {}

protected:
    void mousePressEvent(QMouseEvent *event)
    {
        if (childAt(event->pos())) {
            QLabel *label = dynamic_cast<QLabel *>(childAt(event->pos()));
            if (label) {
                label->setMinimumSize(QSize(50, 50));
                label->setMaximumSize(QSize(50, 50));
            }
        }
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    Window *window = new Window;
    window->show();
    window->resize(400, 300);

    QVBoxLayout *vLayout = new QVBoxLayout;

    QLabel *labels[4];
    for(int i = 0; i < 4; ++i) {
        labels[i] = new QLabel();
        labels[i]->setMaximumSize(30, 30);
        labels[i]->setMinimumSize(30, 30);

        QHBoxLayout *hLayout = new QHBoxLayout;
        hLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
        hLayout->addWidget(labels[i]);
        hLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
        vLayout->addLayout(hLayout);
    }

    window->setLayout(vLayout);
    window->setStyleSheet("QLabel {border: 1px solid red;}");

    return app.exec();
}

введите здесь описание изображения

person svlasov    schedule 24.02.2015
comment
Как работает спейсер? У меня есть некоторые сомнения, сначала я объясню свою ситуацию, у меня есть сетка только с одним столбцом. Все имеют размер 100 100. При щелчке мышью щелкнутый элемент увеличивает свой размер до 200 200, в то время как все ячейки в одном столбце увеличивают свой размер, из-за этого значки, кроме щелкнутого (сейчас масштабируется), выравниваются по левому краю. Мне нужно что-то вроде того, когда размер ячейки увеличился, мне нужно, чтобы они были выровнены по центру (или разделитель должен работать как подушечка значка с выравниванием по центру) - person Akhil V Suku; 24.02.2015
comment
Мне нужно, чтобы отверстие было выровнено по центру в макете во всех случаях - person Akhil V Suku; 24.02.2015
comment
Даже мне нужно придерживаться QGridLayout, потому что я использую одну строку или становится одним столбцом в зависимости от переменной, установленной пользователем. Спасибо за вашу помощь, я проверю это и дам отзыв. - person Akhil V Suku; 24.02.2015
comment
Теперь он не выравнивается по центру или по правому краю. Когда я устанавливаю разделитель на 200, размер ячейки будет равен 200. Но выравнивание все еще не работает. - person Akhil V Suku; 25.02.2015
comment
Почему вы устанавливаете размер прокладки на 200? Я обновил свой ответ полным источником, после нажатия на метку он изменился в размере и остался выровненным по центру. - person svlasov; 25.02.2015
comment
к сожалению, у меня это не сработало, поэтому я изменил его на 200, я попробую последний :) - person Akhil V Suku; 25.02.2015