2016-07-18 6 views
0

私はQtを学習していて、このような小さな例を作成しています。1つのセル内の異なる項目QTableWidget

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

} 
+0

あなたは*同じQTableWidgetItemにテキストとアイコンを設定しようとしましたか? – Frodon

+0

@Frodon:はい、それは私がテーブルのようにしたいものです。しかし、私のコードによれば、最初のアイコンが設定されていますが、テキストが設定されているとアイコンを上書きするのでアイコンはそれ以上ありません。他の言葉で言えば、私のコードでは、私は1つの事をセルに設定することができます。 :( – amateur

+0

あなたのコードでは、新しい 'QTableWidgetItem *'インスタンスによって '(SmallExample :: row、2) 'の項目を上書きします:' itemcalendar-> setText(date); ' – Frodon

答えて

1

これはあなたのコードは次のようになります方法です。

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

私はこの例を試してみましたし、期待どおりに動作します(テキストとアイコンの両方が項目に表示されます)どのような順序でアイコンとテキストを設定しても問題ありません。

あなたはキリルが提案されているようitemを使用し、date_selectedで日付を選択し、新しいアイテムのevety時間を作成する必要はありません。

QTableWidgetItem *itemcalendar = SmallExample::ui.tableWidget->item(SmallExample::row, 2); 
QString date = SmallExample::calendar->selectedDate().toString("dd.MM.yyyy"); 
itemcalendar->setText(date); 
+0

ああ、ひそかにありがとう、私の側では、このコードは機能しません。アイコンをクリックして日付を選択すると、アイコンはそれ以降は表示されず、テキストのみが表示されます。カレンダーの相互作用から問題が発生していると思われます。 – amateur

+0

@amateurカレンダーアイコンをクリックして日付を選択した後に表示されるコードを表示してください。 –

+0

私は上記のコードを更新しました。 – amateur

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); 
+0

あなたのソリューションに感謝します。あなたの提案通りにコードを更新しました。しかし、カレンダーアイコンをクリックして日付にダブルクリックすると、アイコンはそれ以上存在しなくなり(永遠に)、日付テキストだけが表示されます。 :( – amateur

+0

もっと多くのコードを書いていくと、カレンダーのやり取りに[QStyledItemDelegate](http://doc.qt.io/qt-5/qstyleditemdelegate.html)を使用することが役立つことが明らかになりました。 :http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html –

+0

ありがとうKirill! – amateur

2

はたぶん、あなたはあなたのテーブルの2番目の列のためのQStyledItemDelegateを使用することを検討すべきです。

Qtドキュメントのpoststar 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)); 
関連する問題