一个单元格QTableWidget中的不同项目

时间:2016-07-18 07:16:42

标签: qt qtablewidget qtablewidgetitem

我正在学习Qt并创建一个这样的小例子。

table

我已经阅读了一些与我的问题有关的建议问题,但现在我们不容易理解。

这是我的代码,上面的功能是日历交互,下面的功能是显示项目:

SmallExample::SmallExample(QWidget *parent)
     : QWidget(parent)
{
    .........
    connect(ui.tableWidget, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(calendar_clicked(QTableWidgetItem*)));
}

void SmallExample::calendar_clicked(QTableWidgetItem* tableitem) 
{
    int column = tableitem->column();
    SmallExample::row = tableitem->row();

    if (column == 2) {
        if (!calendar) {
            calendar = new QCalendarWidget();
        }
        calendar->setWindowTitle("Calendar");
        calendar->setWindowModality(Qt::WindowModal);
        calendar->show();
        connect(calendar, SIGNAL(activated(const QDate&)), this, SLOT(date_selected(const QDate&)));
    }
}

void SmallExample::date_selected(const QDate&)
{
    QTableWidgetItem *itemcalendar = new QTableWidgetItem;
    QIcon icon(":/icon/calendar.jpg");
    itemcalendar->setIcon(icon);
    SmallExample::ui.tableWidget->setItem(SmallExample::row, 0, itemcalendar);

    QString text= SmallExample::calendar->selectedDate().toString("dd.MM.yyyy");
    QTableWidgetItem *datetext = new QTableWidgetItem;
    datetext->setText(text);
    SmallExample::ui.tableWidget->setItem(SmallExample::row, 0, datetext);
    SmallExample::calendar->close();
}

我知道在添加datetext时,itemcalendar将被覆盖,因此不会再出现。我希望两者都出现,但我不知道如何解决这个问题。提前谢谢!

更新代码:

void SmallExample::date_selected(const QDate&)
{
    QTableWidgetItem *itemcalendar = SmallExample::ui.tableWidget->item(SmallExample::row, 2);
    QIcon icon(":/icon/calendar.jpg");
    itemcalendar->setIcon(icon);
    QString date = SmallExample::calendar->selectedDate().toString("dd.MM.yyyy")
    itemcalendar->setText(date);

}

3 个答案:

答案 0 :(得分:2)

也许您应该考虑在表格的第二列使用QStyledItemDelegate

请参阅此post和Qt文档中的star example

以下是代码示例:

class CalendarDelegate : public QStyledItemDelegate
{
public:
 CalendarDelegate (QObject *parent = 0) : 
  QStyledItemDelegate(parent)
 {
 }

void CalendarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
 {
   painter->save();
   QIcon icon(":/icon/calendar.jpg");
   QSize iconsize = option.decorationSize;

   painter->drawPixmap(0.0, 0.0, icon.pixmap(iconsize.width(), iconsize.height()));

   painter->restore();
  }
}

然后在SmallExample类构造函数中:

SmallExample::ui.tableWidget->setItemDelegateForColumn(2, new CalendarDelegate(this));

答案 1 :(得分:1)

这就是你的代码的样子:

Array
(
    [0] => Array
        (
            [total_transaction] => 2000000
            [month] => May
            [target] => 4000000
        )

    [1] => Array
        (
            [total_transaction] => 1000000
            [month] => June
            [target] => 5000000
        )
)

我刚试过这个例子,它按预期工作(文本和图标都出现在项目中),无论我设置图标和文字的顺序如何。

您不必在QTableWidgetItem *itemcalendar = new QTableWidgetItem; QIcon icon(":/icon/calendar.jpg"); itemcalendar->setIcon(icon); itemcalendar->setText(SmallExample::calendar->selectedDate().toString("dd.MM.yyyy")); SmallExample::ui.tableWidget->setItem(SmallExample::row, 2, itemcalendar); 中选择日期创建新项目的时间,使用date_selected作为Kirill的建议:

item

答案 2 :(得分:1)

如果您只设置一次图标和其他时间文字,则可以使用item方法尝试此类代码:

QTableWidgetItem *itemcalendar = new QTableWidgetItem;
QIcon icon(":/icon/calendar.jpg");
itemcalendar->setIcon(icon);
SmallExample::ui.tableWidget->setItem(SmallExample::row, 2, itemcalendar);

...

QTableWidgetItem* itemcalendar = SmallExample::ui.tableWidget->item(SmallExample::row, 2);
itemcalendar->setText(date);