Sie müssen Ihren eigenen Delegaten dafür implementieren.
In Qt, neben den Daten, dem Modell und der Ansicht, haben Sie Ihre Delegierten. Sie stellen Eingabefähigkeiten bereit und sie sind auch dafür verantwortlich, "spezielle" Elemente in der Ansicht darzustellen, was Sie brauchen.
Qt doc hat eine gute Abdeckung auf diesen (Schlüsselwörter: Model/View programming
), und Sie können auch einige Beispiele here und here finden.
Auch (ein wenig Off-Thema, aber ich denke, ich sollte darauf hinweisen), wenn Sie eine gewöhnliche QTableWidget
verwenden, können Sie alles in jede Zelle mit seiner setCellWidget()
Funktion einfügen.
UPD
hier ist ein leicht modifiziertes Beispiel von Qt-Dokumentation (I mit Model/View-Sachen in Qt saugen so schlägt mich für diesen Code nicht schwer). Es wird eine Schaltfläche in jeder Zelle auf der rechten Seite zeichnen und die Klickereignisse in Zellen abfangen, um zu überprüfen, ob der Klick auf dem "Button" war, und entsprechend reagieren.
Wahrscheinlich ist dies nicht der beste Weg, um es zu tun, aber wie gesagt, ich bin nicht gut mit Qt Modelle und Ansichten.
Um die Dinge richtig zu machen und eine ordnungsgemäße Bearbeitung zu ermöglichen, müssen Sie auch die Funktionen createEditor()
, setEditorData()
und setModelData()
implementieren.
Um Ihre Sachen in eine bestimmte Zelle statt aller Zellen zu zeichnen, fügen Sie einfach eine Bedingung in die paint()
Funktion (beachten Sie, dass es den Modellindex als Argument erhält, so dass Sie immer wissen, in welcher Zelle Sie malen, und entsprechend malen).
delegate.h:
class MyDelegate : public QItemDelegate
{
Q_OBJECT
public:
MyDelegate(QObject *parent = 0);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
};
delegate.cpp:
#include <QtGui>
#include "delegate.h"
MyDelegate::MyDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionButton button;
QRect r = option.rect;//getting the rect of the cell
int x,y,w,h;
x = r.left() + r.width() - 30;//the X coordinate
y = r.top();//the Y coordinate
w = 30;//button width
h = 30;//button height
button.rect = QRect(x,y,w,h);
button.text = "=^.^=";
button.state = QStyle::State_Enabled;
QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);
}
bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if(event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent * e = (QMouseEvent *)event;
int clickX = e->x();
int clickY = e->y();
QRect r = option.rect;//getting the rect of the cell
int x,y,w,h;
x = r.left() + r.width() - 30;//the X coordinate
y = r.top();//the Y coordinate
w = 30;//button width
h = 30;//button height
if(clickX > x && clickX < x + w)
if(clickY > y && clickY < y + h)
{
QDialog * d = new QDialog();
d->setGeometry(0,0,100,100);
d->show();
}
}
return true;
}
main.cpp
#include "delegate.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
MyDelegate delegate;
tableView.setItemDelegate(&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);
tableView.show();
return app.exec();
}
Das Ergebnis wird wie folgt aussehen:
Ich verwende QTableview. Ich möchte diesen Knopf in eine bestimmte Zelle setzen (rechte Ecke der Zelle). Könnten Sie bitte einige Codes teilen? danke in adv .. – Learner
@vikuseth, aktualisierte meine Antwort – SingerOfTheFall
@vikuseth, Oo ist es immer sichtbar für mich. – SingerOfTheFall