Qt — QIcon в ячейке QTableWidget

#qt #icons #qtablewidget

#qt #Значки #qtablewidget

Вопрос:

Я перепробовал множество способов отображения QIcon в ячейке QTableWidget, и я не уверен, почему это не работает. У меня есть кнопка, которая при нажатии добавляет строку в таблицу. Вот код…

 void MainWindow::pressed()
{
    QTableWidgetItem *item = new QTableWidgetItem("Hello, world!");
    QTableWidgetItem *icon_item = new QTableWidgetItem;
    QIcon icon("/verified/path/to/icon.png");
    icon_item->setIcon(icon);

    int row = ui->tableFeed->rowCount();
    ui->tableFeed->insertRow(row);
    ui->tableFeed->setItem(row, 0, icon_item);
    ui->tableFeed->setItem(row, 1, item);
}
  

И это просто не работает. В этой ячейке ничего не отображается. Есть идеи?

РЕДАКТИРОВАТЬ: вызов setItem, в который я его установил icon , был опечаткой. Фактический код устанавливает его в QTabeWidgetItem icon_item . Я исправил это в приведенном выше коде.

Комментарии:

1. Спасибо за ваш пример кода, у меня это сработало! Мой похож на приведенный ниже, надеюсь, это полезно. И я предполагаю, что ваша проблема заключается в пути к изображению. sIconPath = «:/images/NetworkStatusUnkown.png»; // изображение из ресурсов QTableWidgetItem *элемент = новый QTableWidgetItem(ss); // создать значок из статуса QIcon icon2(sIconPath); элемент-> setIcon(icon2); пользовательский интерфейс-> tableWidgetSearchResult->setItem(iRow, 0, элемент);

Ответ №1:

Вы должны присвоить значку значение QTableWidgetItem , а затем загрузить элемент значка, а не сам значок.

 QTableWidgetItem *item = new QTableWidgetItem("Hello, world!");
QTableWidgetItem *icon_item = new QTableWidgetItem;
QIcon icon("/verified/path/to/icon.png"); // It is better to load the icon from the
                                          // resource file and not from a path 
icon_item->setIcon(icon);

int row = ui->tableFeed->rowCount();
ui->tableFeed->insertRow(row);
ui->tableFeed->setItem(row, 0, icon_item);
ui->tableFeed->setItem(row, 1, item);
  

Если вы видите элемент string, а не значок, значит, что-то не так с путем к значку.

Комментарии:

1. Я вижу элемент string, а не значок, но я проверил путь через терминал и дважды и трижды проверил это. Возможны ли какие-либо другие проблемы (размер значка и т.д.)?

2. Можете ли вы вставить строку, в которой вы создаете свой значок (с использованием пути, который вы используете)?

3. QIcon icon("/home/njozwiak/Pictures/icon.png");

4. Попробуйте следующее: Скопируйте свой значок в папку, где находится ваш исходный код, и создайте новый файл ресурсов. В файле ресурсов создайте новый префикс, например icons, и под ним загрузите свою иконку. Присвоите этим значкам псевдоним, например icon. Теперь используйте это для загрузки значка QIcon icon(":/icons/icon") . Для получения более подробной информации проверьте эту ссылку doc.qt.nokia.com/4.7-snapshot/designer-resources.html .

Ответ №2:

Как указывал webclectic, вы, вероятно, захотите установить для элемента значение icon_item :

 ui->tableFeed->setItem(row, 0, icon_item);
  

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

Я не уверен, что произойдет, если значок не может быть создан из указанного png, но вы также можете проверить, действительно ли значок был загружен правильно и может отображаться корректно. Например, что icon.isNull() возвращает? Что произойдет, если поместить это в ярлык?

Другой вариант — загрузить значок из пиксельного изображения, чтобы вы могли убедиться, что он действительно загружен правильно:

 QPixmap p;
if (!p.load(yourFilename) || p.isNull()) { qDebug() << "Error!"; }
QIcon icon = QIcon(p);
// and if wanted: label->setPixmap(p)
  

Комментарии:

1. Я добавил строку if (icon.isNull()) { qDebug() << "Error: null icon"; } в свой исходный код, но сообщение не было отображено. Итак, я изменил путь к файлу, который не существует, и я все еще не получил сообщение. Таким образом, похоже, что независимо от того, существует файл или нет, icon не является нулевым

2. Как бы мне поместить это в ярлык?

3. label.setPixmap(icon.pixmap(width,height)) . Я также отредактировал свой пост, чтобы включить второй способ загрузки изображения.

Ответ №3:

Для их работы вам придется сначала создать ресурс с префиксными значками:

 item = QtGui.QTableWidgetItem()
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/FSTable.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
item.setIcon(icon2)
  

Простите, что выше приведен код PyQt, но вы можете видеть, что значок должен быть настроен с помощью addPixmap

Ответ №4:

Когда я хочу добавить значок в ячейку, я обычно делаю это в модели.

В методе data вы можете поместить их под роль украшения.

 else if( role == Qt::DecorationRole )
{
    switch( index.column() )
    {
        case MOVIE:
        {
            if( valueAt( index ).toString() == "Godfather" ) return QIcon( ":/16x16/godfather.png" );
        }
    }
}
  

Надеюсь, это поможет.