2016-07-18 18 views
0

Ich lerne Qt und ein kleines Beispiel wie folgt erstellen.verschiedene Elemente in einer Zelle QTableWidget

table

Ich habe einige vorgeschlagenen Fragen, die zu meinem Problem beziehen sich hier aber jetzt sind sie nicht leicht für mich zu verstehen.

Dies ist mein Code, über Funktion Kalender Interaktion ist, unten Funktion für Anzeige der Dokumente ist:

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

Ich weiß, wann datetext hinzugefügt wird, wird die itemcalendar überschrieben werden, so dass es nicht mehr angezeigt wird. Ich möchte beides, aber ich weiß nicht, wie ich das lösen soll. Danke im Voraus!

Update-Code:

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

Sie Text und Symbol auf den gleichen QTableWidgetItem * gesetzt Versuchen? – Frodon

+0

@Frodon: Ja, das ist, was ich tun möchte, wie in der Tabelle. Aber nach meinem Code ist das erste Symbol gesetzt, aber wenn Text gesetzt ist, überschreibt es das Symbol, so dass Icon nicht mehr da ist. Oder mit anderen Worten, mit meinem Code kann ich einmal nur eine Sache in die Zelle setzen. :( – amateur

+0

In Ihrem Code überschreiben Sie das Element bei '(SmallExample :: row, 2)' durch eine neue 'QTableWidgetItem *' - Instanz. Sie sollten dieselbe Instanz wiederverwenden: 'itemcalendar-> setText (date);' – Frodon

Antwort

1

Dies ist, wie Ihr Code sollte wie folgt aussehen:

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

ich dieses Beispiel nur versucht haben, und es funktioniert wie erwartet (Text und Symbol erscheint in Artikel) Egal in welcher Reihenfolge ich Icon und Text setze.

Sie haben keine neuen Artikel evety Zeit, die Sie in date_selected wählen Datum erstellen müssen, verwenden Sie item wie Kirill vorgeschlagen:

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

danke Bärtiger, aber an meiner Seite funktioniert dieser Code nicht. Nach dem Klicken auf den Kalender icon und wähle datum, das symbol erscheint seitdem nicht mehr, nur text erscheint. ich schätze problem kommt von kalenderinteraktion.Wenn wir 'itemcalendar-> setText (" bla bla bla ")' es funktioniert, aber hier habe ich eine Kalenderinteraktion. Habe ich Recht? – amateur

+0

@amateur zeigen Sie bitte den Code an, der nach dem Klicken des Kalendersymbols und dem Wählen des Datums angerufen wird. –

+0

ich aktualisierte meinen Code oben. – amateur

1

Wenn Sie nur ein einziges Mal Symbol und ein anderes Mal Text festlegen, können Sie so versuchen Code, mit item Methode:

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

danke für Ihre Lösung. Ich habe meinen Code wie vorgeschlagen aktualisiert. Aber nach dem Klicken auf das Kalendersymbol und Doppelklick auf das Datum ist das Symbol nicht mehr vorhanden (für immer), nur der Datumstext erscheint. :( – amateur

+0

Da Sie mehr Code bereitstellen, wurde klar, dass es hilfreich für Sie sein wird, [QStyledItemDelegate] (http://doc.qt.io/qt-5/qstyleditemdelegate.html) für die Kalenderinteraktion zu verwenden. Qt Beispiel : http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html –

+0

vielen Dank Kirill! – amateur

2

Vielleicht sollten Sie eine QStyledItemDelegate für die zweite Spalte der Tabelle mit in Betracht ziehen.

Siehe hierzu post und die star example aus der Qt-Dokumentation.

Hier ist ein Codebeispiel:

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

Und dann in dem SmallExample Klassenkonstruktors:

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