我正在学习Qt并创建一个这样的小例子。
我已经阅读了一些与我的问题有关的建议问题,但现在我们不容易理解。
这是我的代码,上面的功能是日历交互,下面的功能是显示项目:
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);
}
答案 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);