2015-07-27 13 views
1

У меня есть следующий сценарий: с кнопкой добавления я создаю динамический QLabel, и он получает QPixmap, первый отличается от другого. Поэтому, если я добавлю второй, все будет хорошо. Проблема начинается с добавления третьего. Затем мой второй показанный ярлык должен быть заменен. Я даю вам некоторую картину, которая объяснит мою проблему и мой исходный код. На первом снимке текущей ситуации после того, как 2 раза добавить щелкнул: 2times addКак изменить динамический QLabel с помощью Pixmap (QList)

и здесь после того, как я нажал его в третий раз, как вы можете видеть пиксельный в середине должны быть заменены на один без перекладины: enter image description here

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    counter=0; 

    ui->setupUi(this); 

    //Verteiler links 

} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::changeEvent(QEvent *e) 
{ 
    QMainWindow::changeEvent(e); 
    switch (e->type()) { 
    case QEvent::LanguageChange: 
     ui->retranslateUi(this); 
     break; 
    default: 
     break; 
    } 
} 

void MainWindow::on_pushButton_add_clicked() 
{ 


    int xposition; 
    QPixmap vert_links("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_links"); 
    QPixmap vert_mitte("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_mitte"); 
    QPixmap vert_rechts("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_rechts"); 

    QLabel *label = new QLabel(); 
    //add Label to the List 
    qlist.append(label); 

    xposition=counter*60; 

    if (counter==0) 
    { 
     label->setPixmap(vert_links); 
    } 
    else 
    { 
     xposition=xposition+35; 
     label->setPixmap(vert_rechts); 
    } 
    if (counter>1) 
    { 
     QLabel *label2 = new QLabel(); 
     label2->setPixmap(vert_mitte); 
     label2->show(); 
     label2->setParent(this); 
     label2->setGeometry((xposition-60),500,125,172); 
     qlist.replace(2,label2); 

    } 
    label->setParent(this); 
    label->setGeometry((xposition),500,125,172); 
    label->show(); 

    counter++; 

} 

я получаю следующее сообщение об ошибке от QT «setGeometry: Не удалось установить геометрию 89x172 + 915 + 454 на 'QLabelClassWindow' Результирующий геометрии:. 116x172 + 915 + 454 (рама: 8, 30, 8, 8). " Я предполагаю, что это так, потому что я просто изменяю значение в своем списке, а не в diplayed, но я не знаю, как правильно его закодировать. Спасибо за помощь.

+0

Где вы удаляете предыдущую метку? Почему вы не используете макеты? Почему бы вам не создать одну метку и не изменить только картинку? И почему вы создаете две метки, когда 'counter> 1' ?? – Amartel

+0

Я не снимаю превью. метка. Это звучит как проблема;). Я не использую макеты, потому что мне приходится размещать свои ярлыки рядом друг с другом, или я могу сделать это с помощью макетов? как изменить картину в ней, когда ее динамика? Я создаю второй ярлык, чтобы заменить его на до –

+0

. Вы можете разместить виджет рядом друг с другом, установив [макетное расстояние] (http://doc.qt.io/qt-5.5/qlayout.html#spacing- prop) до нуля. 'setPixmap' меняет изображение, все, что вам нужно сделать, это сделать' QLabel' членом класса 'QMainWindow'. И я все еще не могу понять, зачем вам «label2» вместе с «label». Кроме того, если вам нужно объединить несколько изображений в одном, вы можете сделать это в классе 'QPixmap', используя' QPainter', не создавая несколько меток. – Amartel

ответ

0

Я получил его

void MainWindow::on_pushButton_add_clicked() 
{ 


    int xposition; 
    QPixmap vert_links("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_links"); 
    QPixmap vert_mitte("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_mitte"); 
    QPixmap vert_rechts("C:/Users/Boushar/Desktop/Bachelor_Fred/Coden/Verteiler_rechts"); 

    QLabel *label = new QLabel(); 
    //add Label to the List 


    xposition=counter*60; 

    if (counter==0) 
    { 
     label->setPixmap(vert_links); 
    } 
    else 
    { 
     xposition=xposition+35; 
     label->setPixmap(vert_rechts); 
    } 
    if (counter>1) 
    { 
    qlist.last()->setPixmap(vert_mitte); 

    } 
    qlist.append(label); 
    label->setParent(this); 
    label->setGeometry((xposition),500,125,172); 
    label->show(); 

    counter++; 

} 

просто изменить свою последнюю ListItem в другой пиксельной, перед добавлением нового. Остается только вопрос: как установить данные из определенного элемента списка. Как и раньше:

+1

'if (qlist.count()> 1) qlist [qlist.size() - 2] -> setPixmap (...);'? – Amartel

+0

спасибо человеку и извините за этот очевидный вопрос. я доволен новым QT. я просто знаю случайные списки C++;) –

+0

Afaik, 'QList' поддерживает семантику' std :: list'. – Amartel

 Смежные вопросы

  • Нет связанных вопросов^_^