Seite 1 von 1

Dinamische QTabWidget -> insertTab / addTab (wurm!)

Verfasst: 26. April 2006 22:47
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;

Verfasst: 27. April 2006 07:21
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.

Verfasst: 27. April 2006 09:32
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

Verfasst: 27. April 2006 09:58
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.

Verfasst: 27. April 2006 11:55
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....

Verfasst: 27. April 2006 12:52
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?

Verfasst: 27. April 2006 13:14
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....

Der Bug ist nur im WindowXP style

Verfasst: 2. Mai 2006 11:17
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));  
    }
}