2014-09-24 5 views
0

У меня есть QListWidget, у которого есть элемент, и у меня есть кнопка «Удалить» в моей форме, которая фактически удаляет элемент из списка. Проблема заключается в том, что при загрузке формы в первый раз и я нажимаю remove, не выбирая какой-либо элемент из списка, он берет элемент по 0-му индексу по умолчанию и удаляет его. Ниже приведен фрагмент кода:Элемент QListWidget в 0-м индексе выбран по умолчанию

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    ui->listWidget->addItem(new QListWidgetItem("Item1")); 
    ui->listWidget->addItem(new QListWidgetItem("Item2")); 
    ui->listWidget->addItem(new QListWidgetItem("Item3")); 
} 

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

void MainWindow::on_btnRemove_clicked() 
{ 
    printf("on_btnRemove_clicked() \n"); 

    int currentRow = ui->listWidget->currentRow(); 
    QModelIndex currentIndex = ui->listWidget->currentIndex(); 
    QListWidgetItem* currentItem = ui->listWidget->currentItem(); 

    printf("currentRow: %d\n", currentRow); 

    if(currentRow > -1) { 
     printf("currentIndex.data() %s: \n", currentIndex.data().toString().toStdString().c_str()); 
     printf("currentItem->data(0): %s \n", currentItem->data(0).toString().toStdString().c_str()); 

     QListWidgetItem* itemToDelete = ui->listWidget->takeItem(currentRow); 
     delete itemToDelete; 
     itemToDelete = NULL; 
    } 
} 

Любая идея, как изменить это поведение или, по крайней мере, в любом случае, что я могу показать, что индекс 0-й выбирается по умолчанию синим фоном пункта.

+0

Если у вас есть более одного настраиваемого компонента в форме, то вы можете просто установить фокус любого компонента o чем QListWidget. Это работает для меня, по крайней мере. – gmuhammad

+0

Следует отметить, что для QListWidgetItem с флажками. Если вы установите флажок, функция currentRow() в слоте SIGNAL (itemClicked (QListWidgetItem *)) вернет неправильное значение (?), В моем случае оно всегда возвращает значение 2. – ejectamenta

ответ

1

Вы можете показать выбранный элемент после добавления элементов, по вызывающему setCurrentItem: -

QListWidgetItem* pSelectedItem = new QListWidgetItem("Item1"); 

ui->listWidget->addItem(pSelectedItem); 
ui->listWidget->addItem(new QListWidgetItem("Item2")); 
ui->listWidget->addItem(new QListWidgetItem("Item3")); 

ui->listWidget->setCurrentItem(pSelectedItem); 

Как docs состояние: -

Если режим выбора не NoSelection, пункт, также выбирается.

В качестве альтернативы, вместо извлечения текущего элемента, получить выбранные элементы с selectedItems(), которые я бы ожидать, чтобы вернуть пустой список, с которым вы можете проверить количество элементов: -

if(ui->listWidget->selectedItems().count()) 
{ 
    // delete items 
} 

Обратите внимание, что в сообщении clearSelection указывается: -

Отменяет выбор всех выбранных элементов. Текущий индекс не будет изменен.

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

1

Вы можете использовать функцию setCurrentRow из QListWidget:

// Set the first row as current 
ui->listWidget->setCurrentRow(0); 

и добавить синий цвет фона с:

// Get default background color 
QBrush defaultBrush = ui->listWidget->currentItem->background(); 

// Set background color 
QBrush brush(Qt::blue); 
ui->listWidget->currentItem->setBackground(brush); 

установить цвет по умолчанию:

// Change background color with default color 
ui->listWidget->currentItem->setBackground(defaultBrush); 
+1

Я думаю, что @gmuhammad означал, что он хотел выбранный элемент, который будет отображаться как выбранный, который по умолчанию является синим, а не окрасить его отдельно. Вызвав setCurrentRow, элемент будет выделен как выбранный, поэтому нет необходимости также устанавливать его цвет фона. – TheDarkKnight

+0

Да, это правда. –