2016-12-29 27 views
0

Я пытаюсь сделать приложение, просто рисуя пару фигур, а затем, если выбран из одного из трех QWidgetLists и нажал кнопку, выбранная фигура станет красной. Рисование и т. Д. Не проблема, но я не могу узнать, как я могу проверить, какой список активен и выбрал элемент. Текущий код выглядит следующим образом:Как проверить, какой QListWidget выбрал элемент

QPixmap pixmap(ui->display_field->width(),ui->display_field->height()); 
    pixmap.fill("transparent"); 
    int chosen_one; 

    if(ui->radio_circle->isChecked()){ 
     if(circles_list.count() > 0){ 
      chosen_one = ui->circles_list_wgt->currentItem()->text().toInt(); 
      circles_list[chosen_one].setColor(Qt::red); 
      for(int i=0; i<circles_list.count(); i++) circles_list[i].draw(&pixmap); 
      circles_list[chosen_one].setColor(Qt::black); 
     } 

     for(int i=0; i<rectangles_list.count(); i++) rectangles_list[i].draw(&pixmap); 
     for(int i=0; i<triangles_list.count(); i++) triangles_list[i].draw(&pixmap); 
    } 

    if(ui->radio_rect->isChecked()){ 
     if(rectangles_list.count() > 0){ 
      chosen_one = ui->rectangles_list_wgt->currentItem()->text().toInt(); 
      rectangles_list[chosen_one].setColor(Qt::red); 
      for(int i=0; i<rectangles_list.count(); i++) rectangles_list[i].draw(&pixmap); 
      rectangles_list[chosen_one].setColor(Qt::black); 
     } 

     for(int i=0; i<circles_list.count(); i++) circles_list[i].draw(&pixmap); 
     for(int i=0; i<triangles_list.count(); i++) triangles_list[i].draw(&pixmap); 
    } 

    if(ui->radio_tri->isChecked()){ 
     if(triangles_list.count() > 0){ 
      chosen_one = ui->triangles_list_wgt->currentItem()->text().toInt(); 
      triangles_list[chosen_one].setColor(Qt::red); 
      for(int i=0; i<triangles_list.count(); i++) triangles_list[i].draw(&pixmap); 
      triangles_list[chosen_one].setColor(Qt::black); 
     } 

     for(int i=0; i<circles_list.count(); i++) circles_list[i].draw(&pixmap); 
     for(int i=0; i<rectangles_list.count(); i++) rectangles_list[i].draw(&pixmap); 
    } 

    ui->display_field->setPixmap(pixmap); 

Первоначально приложение было немного другой метод работы, в зависимости от радиокнопок, как это прямо сейчас. Я хочу, чтобы он зависел от выбора элемента.

ответ

0

Две проблемы с вашим решением:

  1. Вы на самом деле есть три выбор: Каждый QListWidget имеет свой собственный выбор, таким образом, имеет свой собственный текущий пункт.
  2. Вы должны сделать чертеж в paintEvent.

Я хотел бы предложить следующее:

  • подклассы QWidget, который поддерживает списки элементов, которые вы хотите сделать.
  • Внедрение метода виджетов QWidget::paintEvent. Этот метод автоматически вызывается Qt, когда на экране должен отображаться виджет. Вы можете вручную запросить это, вызвав QWidget::update, например. когда ваш выбор формы изменился.
  • Возможно, вы даже хотите разложить рисунок на отдельные классы, например, Rectangle, a Circle и класс Triangle.

Тогда создайте, пожалуйста, вашу форму включая три QListWidget. Создайте один слот и соедините списки «QListWidget::currentRowChanged» в целом. Поэтому он будет вызываться всякий раз, когда вы выбираете другую фигуру в любом из списков. Внутри слота вы можете различить, используя процедуру sender(), из которой из списков пользователь выбрал форму. Обновите виджет рисунка соответственно, позвоните update, и все готово.