Seite 1 von 1

[gelöst]ComboBox nachträglich in GroupBox einfügen.

Verfasst: 10. Juli 2007 11:38
von stonecold
Hallo,

Ich habe ein MainWindow mit CentralWidget und in diesem CentralWidget eine TreeView und eine GroupBox inkl. einer ComboBox.

Wenn nun ein Element aus der TreeView angeklickt wird soll der entsprechende Slot, der GroupBox, eine zusätzliche ComboBox hinzufügen.

Da das aber irgendwie nicht richtig funktioniert hat habe ich mittlerweile alle Kombination von update() etc. ausprobiert. Bis auf eine :-) Nämlich die Richtige. Deshalb meine Frage.

Wie füge ich dynamisch Elemente in ein Widget ein?

Meine letzter versuch war:

void MainWindow::TreeViewSlot(....
{.....
comboBox2 = new QComboBox(groupBox);
comboBox2->setObjectName(QString::fromUtf8("comboBox2"));
comboBox2->setGeometry(QRect(300, 90, 171, 22));
groupBox->update() ....
}

Ich hatte auch bereits this->update() und auch repaint() versucht.

Verfasst: 10. Juli 2007 12:07
von macman
Guck dir einfach mal ein ui_*.h-Datei an. Was da alles gemacht wird, um ein Widget zu erstellen. Einfach das Parent neu zu malen bringt überhaupt nichts.

Verfasst: 10. Juli 2007 13:40
von stonecold
Danke für die Antwort nur leider weiß ich nicht genau was du meinst.

Natürlich habe ich im Vorfeld mal rein geschaut und im Prinziep auch alles mal ausprobiert, was ich gesehen habe.

Was genau meinst du? Mein UI File sieht nun wieder etwas anders aus, da ich etwas umgebaut habe. Das Problem bleibt das Selbe z.B.:

ComboBox ins centralwidget einfügen wenn Slot clicked() von QTreeView betätigt wird.

Code: Alles auswählen

#ifndef UI_XML_PARSER_H
#define UI_XML_PARSER_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QTreeView>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
    QAction *actionOpen;
    QAction *actionSave;
    QAction *actionExit;
    QWidget *centralwidget;
    QTreeView *treeView;
    QMenuBar *menubar;
    QMenu *menuFile;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->setMinimumSize(QSize(600, 510));
    MainWindow->setMaximumSize(QSize(600, 510));
    actionOpen = new QAction(MainWindow);
    actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
    actionSave = new QAction(MainWindow);
    actionSave->setObjectName(QString::fromUtf8("actionSave"));
    actionExit = new QAction(MainWindow);
    actionExit->setObjectName(QString::fromUtf8("actionExit"));
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    treeView = new QTreeView(centralwidget);
    treeView->setObjectName(QString::fromUtf8("treeView"));
    treeView->setGeometry(QRect(20, 20, 220, 431));
    treeView->setMinimumSize(QSize(220, 431));
    treeView->setMaximumSize(QSize(220, 431));
    treeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    treeView->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
    treeView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
    treeView->setIndentation(20);
    treeView->setRootIsDecorated(true);
    treeView->setUniformRowHeights(false);
    treeView->setAllColumnsShowFocus(false);
    MainWindow->setCentralWidget(centralwidget);
    menubar = new QMenuBar(MainWindow);
    menubar->setObjectName(QString::fromUtf8("menubar"));
    menubar->setGeometry(QRect(0, 0, 600, 19));
    menuFile = new QMenu(menubar);
    menuFile->setObjectName(QString::fromUtf8("menuFile"));
    menuFile->setGeometry(QRect(1298, 111, 112, 113));
    MainWindow->setMenuBar(menubar);
    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    MainWindow->setStatusBar(statusbar);

    menubar->addAction(menuFile->menuAction());
    menuFile->addAction(actionOpen);
    menuFile->addAction(actionSave);
    menuFile->addSeparator();
    menuFile->addAction(actionExit);

    retranslateUi(MainWindow);

    QSize size(600, 510);
    size = size.expandedTo(MainWindow->minimumSizeHint());
    MainWindow->resize(size);


    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "XML-Parser", 0, QApplication::UnicodeUTF8));
    actionOpen->setText(QApplication::translate("MainWindow", "&Open File", 0, QApplication::UnicodeUTF8));
    actionOpen->setShortcut(QApplication::translate("MainWindow", "Ctrl+O", 0, QApplication::UnicodeUTF8));
    actionSave->setText(QApplication::translate("MainWindow", "&Save File", 0, QApplication::UnicodeUTF8));
    actionSave->setIconText(QApplication::translate("MainWindow", "Save File", 0, QApplication::UnicodeUTF8));
    actionSave->setToolTip(QApplication::translate("MainWindow", "Save File", 0, QApplication::UnicodeUTF8));
    actionSave->setShortcut(QApplication::translate("MainWindow", "Ctrl+S", 0, QApplication::UnicodeUTF8));
    actionExit->setText(QApplication::translate("MainWindow", "E&xit", 0, QApplication::UnicodeUTF8));
    actionExit->setShortcut(QApplication::translate("MainWindow", "Ctrl+X", 0, QApplication::UnicodeUTF8));
    menuFile->setTitle(QApplication::translate("MainWindow", "&File", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // UI_XML_PARSER_H
Sehe nichts was mich weiterbringen würde.
MainWindow->setCentralWidget(centralwidget); bzw.
this->setCentralWidget(centralwidget);
Hatte ich auch mit ausprobiert.

Verfasst: 10. Juli 2007 15:17
von macman
Ich vermisse Layouts, mehr kann ich da erstmal nicht zu sagen. Sollte auch ohne gehen, aber das kann ich momentan nicht testen.

Verfasst: 10. Juli 2007 15:30
von stonecold
Hallo macman!
Weißt du denn wie es geht?

Hier mal ein neues UI-File mit GroupBox, Layout und ComboBox

Code: Alles auswählen

#ifndef UI_TEST_H
#define UI_TEST_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QComboBox>
#include <QtGui/QGroupBox>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QGroupBox *groupBox;
    QWidget *verticalLayout;
    QVBoxLayout *vboxLayout;
    QComboBox *comboBox;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    groupBox = new QGroupBox(centralwidget);
    groupBox->setObjectName(QString::fromUtf8("groupBox"));
    groupBox->setGeometry(QRect(100, 50, 361, 251));
    verticalLayout = new QWidget(groupBox);
    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    verticalLayout->setGeometry(QRect(19, 19, 341, 231));
    vboxLayout = new QVBoxLayout(verticalLayout);
    vboxLayout->setSpacing(6);
    vboxLayout->setMargin(0);
    vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
    comboBox = new QComboBox(verticalLayout);
    comboBox->setObjectName(QString::fromUtf8("comboBox"));

    vboxLayout->addWidget(comboBox);

    MainWindow->setCentralWidget(centralwidget);
    menubar = new QMenuBar(MainWindow);
    menubar->setObjectName(QString::fromUtf8("menubar"));
    menubar->setGeometry(QRect(0, 0, 514, 19));
    MainWindow->setMenuBar(menubar);
    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    MainWindow->setStatusBar(statusbar);

    retranslateUi(MainWindow);

    QSize size(514, 358);
    size = size.expandedTo(MainWindow->minimumSizeHint());
    MainWindow->resize(size);


    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    groupBox->setTitle(QApplication::translate("MainWindow", "GroupBox", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(MainWindow);
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // UI_TEST_H
Ich muss sagen, dass ich auch hier keine gravierenden Unterschiede erkenne.

Vielleicht muss ich meine Frage nochmal formulieren:

Wie füge ich einer GroupBox (o.ä.), auf ein bestimmtes Ereignis hin (z.B. anklicken eines Elementes einer QTreeView), beispielsweise eine QComboBox hinzu, so dass ich sie anschließend sehen und benutzen kann?
(Die GUI ist bereits erzeugt und ihr soll zur Laufzeit die ComboBox hinzugefügt werden!)

Verfasst: 10. Juli 2007 16:02
von macman
Ich habe schon einige Male mit dynamischen Dialogen zu tun gehabt, hauptsächlich ging es dabei aber ganze TabPanels etc. Ich kann da so nichts weiter zu sagen, aber da es sich um ein Testprojekt handelt, stell es doch mal ins Forum, damit man es sich angucken kann.

Verfasst: 10. Juli 2007 16:13
von upsala
1. Layout verwenden
2. setVisible verwenden

Verfasst: 10. Juli 2007 23:32
von stonecold
Danke für die Tips.

QWidget->hide();

..........

QWidget->show();


Das war es schon. Eigentlich einfach, doch recht schwer zu finden!