#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" );
}
}
}
Надеюсь, это поможет.