【问题标题】:Qt - QIcon in QTableWidget cellQt - QTableWidget 单元格中的 QIcon
【发布时间】:2011-11-09 19:08:19
【问题描述】:

我尝试了多种方法在 QTableWidget 单元格中显示 QIcon,但我不确定它为什么不起作用。我有一个按钮,按下时会在表格中添加一行。这是代码...

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

而且它只是不起作用。该单元格中不显示任何内容。有什么想法吗?

编辑:我将其设置为 icon 的 setItem 调用是一个错字。实际代码将其设置为QTabeWidgetItem icon_item。我已经在上面的代码中更正了。

【问题讨论】:

  • 感谢您的示例代码,它确实对我有用!我的如下,希望对你有帮助。我猜你的问题是图像路径。 sIconPath = ":/images/NetworkStatusUnkown.png"; // 图片来自资源 QTableWidgetItem *item = new QTableWidgetItem(ss); // 从状态构建图标 QIcon icon2(sIconPath);项目->setIcon(icon2); ui->tableWidgetSearchResult->setItem(iRow, 0, item);

标签: qt icons qtablewidget


【解决方案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);

如果您可以看到字符串项而不是图标,则说明图标路径有问题。

【讨论】:

  • 我可以看到字符串项而不是图标,但我验证了通过终端的路径并对其进行了双重和三重检查。是否还有其他可能的问题(图标大小等)?
  • 你能粘贴你构建图标的那一行(和你正在使用的路径)吗?
  • QIcon icon("/home/njozwiak/Pictures/icon.png");
  • 尝试以下操作:将您的图标复制到您的源文件夹中,并创建一个新的资源文件。在资源文件中创建一个新前缀,例如图标,并在其下加载您的图标。给这个图标一个别名,例如图标。现在使用它来加载图标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);

...如果它确实以这种方式编译,那么我猜它正在使用其available constructors 之一构造一个隐式 QTableWidgetItem。

我不确定如果无法从指定的 png 构建图标会发生什么,但您也可以检查以确保图标确实正确加载并且可以正确显示。例如,icon.isNull() 返回什么?如果你把它放在标签里会发生什么?

另一种选择是从像素图中加载图标,这样您就可以验证它确实已正确加载:

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

【讨论】:

  • 我将if (icon.isNull()) { qDebug() &lt;&lt; "Error: null icon"; } 行添加到我的源中,但没有显示任何消息。所以我修改了一个不存在的文件的路径,还是没有收到消息。所以看起来文件是否存在,icon 不为空
  • 如何将它放入标签中?
  • 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】:

    当我想为单元格添加图标时,我通常在模型中进行。

    在数据方法中你可以把它们放在装饰角色下。

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2021-06-09
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多