如何检查哪个QListWidget已选择项目

时间:2016-12-29 15:56:19

标签: c++ qt qlistwidget

我正在尝试只绘制几个形状的应用程序然后如果从三个QWidgetLists中的一个中选择并单击一个按钮,则所选的形状将变为红色。绘图等不是问题,但我无法找出如何检查哪个列表是活动的并且已选择项目。当前代码如下所示:

    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);

原始应用程序有一些不同的工作方法,具体取决于现在的无线电按钮。我希望它只是项目选择依赖。

1 个答案:

答案 0 :(得分:0)

您的解决方案有两个问题:

  1. 您实际上有三个选项:每个QListWidget都有自己的选择,因此有自己的当前项。
  2. 您应该使用paintEvent
  3. 进行绘图

    我建议如下:

    • 子类QWidget,用于维护您要绘制的项目列表。
    • 实现小部件的QWidget::paintEvent方法。当需要在屏幕上绘制窗口小部件时,Qt会自动调用此方法。您可以致电QWidget::update手动申请,例如当您的形状选择发生变化时。
    • 也许您甚至想要将绘图分解为单独的类,例如RectangleCircleTriangle类。

    然后创建包含三个QListWidget的表单。创建一个插槽并将列表'QListWidget::currentRowChanged信号连接到此单个插槽。因此,只要您在任何列表中选择另一个形状,就会调用它。在插槽内,您可以使用sender()例程来区分用户选择形状的列表。相应地更新您的绘图小部件,请致电update,然后您就完成了。