Seite 1 von 1

Hilfe mit Container-Tabellen Plugin für den Designer

Verfasst: 18. April 2007 15:32
von UmmonTL
Hallo,
ich bin gerade dabei mich an einem Plugin für den QT-Designer zu versuchen. Was ich erreichen will ist ein Container-Widget welches eine Tabelle von Frames zur Verfügung stellt in die wiederum andere Widgets platziert werden können. Die Tabelle soll natürlich beliebig in ihrer Größe verändert werden können und es soll möglich sein über entsprechende Slots die Frames zeilen- bzw. spaltenweise oder in einem rechteckigen Bereich zu deaktivieren oder zu verstecken.

Soviel zu meinem Ziel, ich habe mich an den Beispielen zum MultiPageWidgetPlugin (Container Extension Example) bzw. TicTacToePlugin (Task Menu Extension Example) orientiert. Ich habe es soweit geschafft dass meine Tabelle im Designer platzierbar und in der Größe über den Property Editor veränderbar ist. Gespeichert werden die Frames in einer Liste von Listen von Frames, sie sind ausserdem in einem GridLayout angeordnet. Was noch nicht funktioniert ist die Platzierung weiterer Widgets in den einzelnen Frames, die ganze Tabelle arbeitet wie ein einzelner großer Container.

Gibt es eine Möglichkeit die einzelnen Frames im Designer direkt für die Platzierung freizugeben?
Kann man Containerbereiche auf dem Widget definieren?
Kann man die Methoden zum platzieren auf dem Widget überladen um sie auf die inneren Frames umzuleiten?

Ich bin für jede Hilfe dankbar,
Ummon.

Quellcode:

tablewidget.cpp:

Code: Alles auswählen

#include <QtGui>

#include "../header/tablewidget.h"

TableWidget::TableWidget(QWidget *parent)
    : QWidget(parent)
{
	table = new QList< QList< QFrame *> *>();
	rows = 3;
	columns = 3;
    layout = new QGridLayout;
    layout->setMargin(0);
    layout->setSpacing(0);  
    for (int r=0; r<rows; r++){
    	QList<QFrame *> *row = new QList< QFrame *>();
    	for (int c=0; c<columns; c++){
    		QFrame *frame = new QFrame(this);
    		frame->setFrameShape(QFrame::Panel);
    		frame->setFrameShadow(QFrame::Raised);
    		layout->addWidget(frame, r, c);
    		row->append(frame);
    	}
    	table->append(row);
    }     
    setLayout(layout);
}

void TableWidget::setRows(const int &r)
{
	if (r<rows){
		while (table->size() > r)
			table->removeLast();
	} else {
		while (table->size() < r){			
			QList<QFrame *> *row = new QList< QFrame *>();
    		for (int c=0; c<columns; c++){
    			QFrame *frame = new QFrame(this);
    			frame->setFrameShape(QFrame::Panel);
    			frame->setFrameShadow(QFrame::Raised);
    			layout->addWidget(frame, table->size(), c);
    			row->append(frame);
    		}
    		table->append(row);    	
		}	
	}	
	rows = r;
}

void TableWidget::setColumns(const int &c)
{
	if (c<columns){
		while (table->first()->size()>c){
			for (int r=0; r<rows; r++){
				table->at(r)->removeLast();
			}
		}
	} else {		
		while (table->first()->size()<c){
			for (int r=rows-1; r>=0; r--){
				QFrame *frame = new QFrame(this);
    			frame->setFrameShape(QFrame::Panel);
    			frame->setFrameShadow(QFrame::Raised);
    			layout->addWidget(frame, r, table->first()->size());
				table->at(r)->append(frame);
			}
		}
	}
	columns = c;
}

int TableWidget::getRows() const
{
	return rows;
}
int TableWidget::getColumns() const
{
	return columns;
}

QSize TableWidget::minimumSizeHint() const
{
    return QSize(200, 200);
}

QSize TableWidget::sizeHint() const
{
    return QSize(200, 200);
}
tablewidgetplugin.cpp:

Code: Alles auswählen

#include <QtDesigner/QExtensionFactory>
#include <QtDesigner/QExtensionManager>
#include <QtDesigner/QDesignerFormEditorInterface>
#include <QtDesigner/QDesignerFormWindowInterface>

#include <QIcon>
#include <QtPlugin>

#include "../header/tablewidget.h"
#include "../header/tablewidgetplugin.h"

TableWidgetPlugin::TableWidgetPlugin(QObject *parent)
    :QObject(parent)
{
    initialized = false;
}

QString TableWidgetPlugin::name() const
{
    return QString("TableWidget");
}

QString TableWidgetPlugin::group() const
{
    return QString("Containers");
}

QString TableWidgetPlugin::toolTip() const
{
    return "";
}

QString TableWidgetPlugin::whatsThis() const
{
    return "";
}

QString TableWidgetPlugin::includeFile() const
{
    return QString("tablewidget.h");
}

QIcon TableWidgetPlugin::icon() const
{
    return QIcon();
}

bool TableWidgetPlugin::isContainer() const
{
    return true;
}

QWidget *TableWidgetPlugin::createWidget(QWidget *parent)
{
    TableWidget *widget = new TableWidget(parent);
    return widget;
}

bool TableWidgetPlugin::isInitialized() const
{
    return initialized;
}

void TableWidgetPlugin::initialize()
{
    if (initialized)
        return;

    initialized = true;
}

QString TableWidgetPlugin::domXml() const
{
    return QString("\
    <widget class=\"TableWidget\" name=\"tablewidget\">\
    </widget>\
    ");
}


Q_EXPORT_PLUGIN2(tablecontainerwidget, TableWidgetPlugin)

Verfasst: 24. April 2007 10:36
von UmmonTL
Oder gibt es vielleicht eine möglichkeit mehrere Pages auf einmal anzuzeigen?