Qt - 在 QTableWidget 单元格中使用 QIcon

10

我尝试了多种方法来在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); item- > setIcon(icon2); ui->tableWidgetSearchResult->setItem(iRow, 0, item); - JohnnyLinTW
4个回答

5

您需要将图标设置为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);

如果你能看到字符串项但看不到图标,则说明图标路径存在问题。

我能看到字符串项,但是没有看到图标,但是我通过终端验证了路径,并且进行了双重和三重检查。是否还有其他可能的问题(图标大小等)? - linsek
你能复制粘贴构建图标的代码行吗(包括你使用的路径)? - pnezis
QIcon icon("/home/njozwiak/Pictures/icon.png"); - linsek
尝试以下操作:将您的图标复制到源代码所在的文件夹中,并创建一个新的资源文件。在资源文件中创建一个新的前缀,例如icons,在其下加载您的图标。给这些图标一个别名,例如icon。现在使用QIcon icon(":/icons/icon")来加载图标。有关更多详细信息,请查看此链接http://doc.qt.nokia.com/4.7-snapshot/designer-resources.html。 - pnezis

2

当我想在单元格中添加图标时,通常会在模型中完成。

在数据方法中,您可以将它们放在装饰角色下。

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

希望这可以帮助您。

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)

我在我的源代码中添加了一行 if (icon.isNull()) { qDebug() << "Error: null icon"; },但没有显示任何消息。因此,我修改了路径以指向一个不存在的文件,但仍然没有收到消息。所以看起来无论文件是否存在,icon 都不是空的。 - linsek
我该如何将它放入标签中? - linsek
label.setPixmap(icon.pixmap(width,height)) 可以翻译为:label.setPixmap(icon.pixmap(宽度,高度))。我也编辑了我的帖子,包括第二种加载图像的方法。 - Kaleb Pederson

2

您需要先创建一个带有前缀 "icons" 的资源才能使它们起作用:

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来设置图标。


这个答案没有解释如何使用fromUtf8。可以使用QtCore.QString.fromUtf8来导入它。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接