Dinamische QTabWidget -> insertTab / addTab (wurm!)

Alles rund um die Programmierung mit Qt
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Dinamische QTabWidget -> insertTab / addTab (wurm!)

Beitrag von patrik08 »

in der QMainWindow aus einem ui mainwindow habe ich diese class....

class Gui_Main : public QMainWindow, public Ui::Gui_Main

sie funktioniert prima aber oben links macht sich ein wurm auf der menu bar breit.... wenn ich AddTabulator nicht starte kommt wieder alles normal .... aber ohne tabellen...

was mache ich falsch?....

Code: Alles auswählen

void Gui_Main::AddTabulator(QString table , int pos)   /* sql table & in position ab 1> */
{
   const QString tabi = table;
    qwid = new QWidget();
    /* qwid->setObjectName(QString( "qwidget_tab_%1" ).arg( int2char(pos) )); */
    qgrid = new QGridLayout(qwid);
    qgrid->setSpacing(6);
    qgrid->setMargin(9);
    /* qgrid->setObjectName(QString( "tab_grid_lay_%1" ).arg( int2char(pos) )); */
    tabletab = new QTableView(qwid);
    tabletab->setObjectName(QString( "table_tab_%1" ).arg( tabi ));
        sqlmodel = new QSqlTableModel(this);
        sqlmodel->setTable(table);
        sqlmodel->setEditStrategy(QSqlTableModel::OnFieldChange);
        sqlmodel->select();
        tabletab->setModel(sqlmodel);
        tabletab->setItemDelegate(new QSqlRelationalDelegate(tabletab));
        qheader = new QHeaderView(Qt::Horizontal,this);
        qheader = tabletab->horizontalHeader(); 
        connect (qheader,SIGNAL(sectionClicked(int)),this,SLOT(sortColumn(int))); 
        tabletab->resizeColumnsToContents();
    qgrid->addWidget(tabletab, 0, 0, 1, 1);
    /* recipe1->addTab( qwid , tabi ); */
    recipe1->insertTab( pos , qwid , tabi);
    /* recipe1->setTabText(pos, QString( "%1 (%2)" ).arg( table , int2char(pos) ) ); */
}
die tab 0 ist recipe1 alles ist deklariert...
QFileDialog *filedlg;
QMessageBox *msgb;
QWidget *qwid;
QGridLayout *qgrid;
QTableView *tabletab;
QHeaderView *qheader;
Dateianhänge
wurm.png
wurm.png (8.26 KiB) 3686 mal betrachtet
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ist dein qgrid vorher leer oder hast Du dem vorher schon mal ein Layout zugewiesen. Dann sehe ich nirgends ein qwid->setLayout(qgrid). Mein Tipp, erstell sowas mal mit dem Designer und schau dir dann die setupUi() an.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

wenn 5 tabellen sind im excel/openoffice werden 5 x die funktion AddTabulator aufgerufen....

irgendwo habe ich ein notepad textedit demo gesehen der ruft auch x mal ein addTab tab oder remove.... auf musste doch gehen....


Code: Alles auswählen

void Gui_Main::PaintTables()
{
       QSqlQuery query;
       QString current;
       QString tablequery ="SELECT name  FROM sqlite_master WHERE type!='meta' AND sql NOT NULL ORDER BY name";
       query.exec(tablequery); 
       QSqlRecord rec = query.record();
       int loop = 0;
       while (query.next()) {
            loop++;
            current = query.value(0).toString();
            AddTabulator(current,loop); 
        }
}

ein ui 3-4 mal macht so....



Code: Alles auswählen


  void setupUi(QWidget *Form)
    {
    Form->setObjectName(QString::fromUtf8("Form"));
    Form->resize(QSize(400, 300).expandedTo(Form->minimumSizeHint()));
    gridLayout = new QGridLayout(Form);
    gridLayout->setSpacing(6);
    gridLayout->setMargin(9);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    recipe = new QTabWidget(Form);
    recipe->setObjectName(QString::fromUtf8("recipe"));
    tab = new QWidget();
    tab->setObjectName(QString::fromUtf8("tab"));
    gridLayout1 = new QGridLayout(tab);
    gridLayout1->setSpacing(6);
    gridLayout1->setMargin(9);
    gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
    tableView = new QTableView(tab);
    tableView->setObjectName(QString::fromUtf8("tableView"));

    gridLayout1->addWidget(tableView, 0, 0, 1, 1);

    recipe->addTab(tab, QApplication::translate("Form", "Tab 0", 0, QApplication::UnicodeUTF8));
    tab_3 = new QWidget();
    tab_3->setObjectName(QString::fromUtf8("tab_3"));
    gridLayout2 = new QGridLayout(tab_3);
    gridLayout2->setSpacing(6);
    gridLayout2->setMargin(9);
    gridLayout2->setObjectName(QString::fromUtf8("gridLayout2"));
    tableView_2 = new QTableView(tab_3);
    tableView_2->setObjectName(QString::fromUtf8("tableView_2"));

    gridLayout2->addWidget(tableView_2, 0, 0, 1, 1);

    recipe->addTab(tab_3, QApplication::translate("Form", "tab 1", 0, QApplication::UnicodeUTF8));
    tab_4 = new QWidget();
    tab_4->setObjectName(QString::fromUtf8("tab_4"));
    gridLayout3 = new QGridLayout(tab_4);
    gridLayout3->setSpacing(6);
    gridLayout3->setMargin(9);
    gridLayout3->setObjectName(QString::fromUtf8("gridLayout3"));
    tableView_3 = new QTableView(tab_4);
    tableView_3->setObjectName(QString::fromUtf8("tableView_3"));

    gridLayout3->addWidget(tableView_3, 0, 0, 1, 1);

    recipe->addTab(tab_4, QApplication::translate("Form", "tab 2", 0, QApplication::UnicodeUTF8));
    tab_2 = new QWidget();
    tab_2->setObjectName(QString::fromUtf8("tab_2"));
    gridLayout4 = new QGridLayout(tab_2);
    gridLayout4->setSpacing(6);
    gridLayout4->setMargin(9);
    gridLayout4->setObjectName(QString::fromUtf8("gridLayout4"));
    tableView_4 = new QTableView(tab_2);
    tableView_4->setObjectName(QString::fromUtf8("tableView_4"));

    gridLayout4->addWidget(tableView_4, 0, 0, 1, 1);

    recipe->addTab(tab_2, QApplication::translate("Form", "Tab 3", 0, QApplication::UnicodeUTF8));

    gridLayout->addWidget(recipe, 0, 0, 1, 1);

    retranslateUi(Form);

    QMetaObject::connectSlotsByName(Form);
    } // setupUi
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

patrik08 hat geschrieben:wenn 5 tabellen sind im excel/openoffice werden 5 x die funktion AddTabulator aufgerufen....
Habe selbst ein Programm geschrieben, welches eine dynamische Anzahl an Tabs hat. Man kann einzelne hinzufügen und entfernen, verschieben geht allerdings noch nicht :-)

Jedenfalls habe ich da eine Funktion setupPanel(int index), die etwas Ähnliches wie deine macht, nur enthalten die Panels Groupboxen usw., weshalb verschachtelte Layouts zum Einsatz kommen. Daher hatte ich addLayout und setLayout in Erinnerung.

Lange Rede, kurzer Sinn, ich denke dein Fehler besteht darin das Du alle deine Tabs in qwid schreibst und im setupUi siehst Du tab, tab_2, tab_3 usw.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

im ui habe ich nur ein tab wo ich nort sud ecc... angeben....
und der vom ui an position 0 (null) geht mit removeTab raus...

was von mir aus probleme macht ist qgridlayout....

Code: Alles auswählen


    int loop = 0;
       while (query.next()) {
            loop++;
            tabWidget->removeTab(loop - 1);   /* repaint all table ... */
            current = query.value(0).toString();
            AddTabulator(current,loop - 1); 
        }

in php-gtk habe ich ja auch multi tab gemacht aber der name ist array...

Code: Alles auswählen


 ///// function to build an entire GtkNotebook page /////
 function Build_Text_Area($name,$nr=null) {
        $this->Separator[$name] = new GtkVBox(false,2);
        $this->Bar[$name] = new GtkToolbar();
		$this->Bar[$name]->add($this->Clicker('  Exit  ','__destruct'));
		if ($nr !=2) {
		$this->Bar[$name]->add($this->Clicker('  Open File '.$name.'  ','open_'.$name));
		$this->Bar[$name]->add($this->Clicker('  Save '.$name.'  ','save_'.$name));
		} else {
		$this->Bar[$name]->add($this->Clicker('  Convert  ','producer_convert'));
		$this->Bar[$name]->add($this->Clicker('  Save File  ','producer__save'));
		}
		
		$this->Bar[$name]->add($this->Clicker('  Color  ','set_color_new'));
		$this->Bar[$name]->add($this->Clicker('  Font  ','set_font_new'));
		$this->Bar[$name]->add($this->Clicker('  About  ','__about'));
		$this->Bar[$name]->add($this->Clicker('  Help  ','__help'));
		
        $this->Separator[$name]->add($this->Bar[$name]);
        $this->Border_Scroll[$name] = new GtkScrolledWindow();
		$this->Border_Scroll[$name]->set_policy(GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);
		$this->Border_Scroll[$name]->set_border_width(15);
		$this->Text_Area[$name]  = new GtkTextView();
		
		$this->Buffer_0[$name] = $this->Text_Area[$name]->get_buffer();
		$this->Buffer_0[$name]->set_text($this->puffermg);
		
		$this->Buffer_0[$name]->connect('mark-set',array(&$this,"CaptureBuffer"));
		$this->Buffer_0[$name]->connect("insert-text", array(&$this, "active_notebook"));
		$this->Text_Area[$name]->set_size_request($this->Large,500);
		
		$this->Text_Area[$name]->set_border_window_size(GTK_TEXT_WINDOW_RIGHT,5);
		$this->Status[$name] = new GtkStatusbar();
		$this->Status[$name]->push(0,"\t".__CLASS__.' Modus '.$nr);
		$this->Border_Scroll[$name]->add($this->Text_Area[$name]);
		$this->Separator[$name]->add($this->Border_Scroll[$name]);
		$this->Separator[$name]->add($this->Status[$name]);
 return $this->Separator[$name];
 }
//// full http://ciz.ch/svnciz/new_php_gtk2/xmleditor_final/XML_Editor_XSLT_Converter.php

aber mit qt kann man ja keine Objekte als typ in einen return geben....
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

patrik08 hat geschrieben:aber mit qt kann man ja keine Objekte als typ in einen return geben....
Warum sollte das nicht gehen oder meinst Du was anderes als ich?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

ja .. das habe ich nun gesehen im neuen Scribus Desktop Publishing window/mac qt code...

der macht so etwa...

QWidget* classname::_layotTab(qstring name)
{
QWidget a = new QWidget(this)
packt eine tabs rein..... und dann....
return a;
}

und wo er die funktion aufruft ...
while....
tabWidget->insertTab( i++ , _layotTab("") , "name" );

... auf mac compiliert ... das selbe resultat... nun builde ich qt 4.1.2 probiere was passiert ob es differenzen gibt zu meinem aktuellen 4.1.1 qt....
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Der Bug ist nur im WindowXP style

Beitrag von patrik08 »

Also ich habe der bug (wurm) tatsachchlich gefunden!

ich habe extra ein qwidget gemacht .. um bei jeden neuen tab zu hinzufuegen...

http://ciz.ch/svnciz/dialog_qt/qt4_a/sq ... e_table.ui

Bei WindowXP style kommt der fleck raus bei alle andere style nicht...

und das kann man sehen wenn man so umschaltet.....

Code: Alles auswählen


void Gui_Main::SetUserStyle()
{
  bool ok;
  QStringList style;
  style << QStyleFactory::keys();
  QString stylename = QInputDialog::getItem(this,"Set Style Application","Select Your Style:", style, 0, false, &ok);
    if (ok && !stylename.isEmpty()) {
      QApplication::setStyle(QStyleFactory::create(stylename));  
    }
}


Antworten