2017-04-04 10 views
0

QtのウィジェットアプリケーションのUIに手書きのデザインを簡単にリンクする方法を探しています。 UIビルダーを使用して、レイアウトを簡単に調整し、適切な間隔を取得する予定です。これは、UIビルダーなしでは困難です。ボタンが表示されていないのはなぜ私がQVector< QVector<QPushButton*> >を使用する予定のため
私は、ボタンの3x3のグリッドを作成したい(私はUIビルダでこれを行うだろうかわからない。)Qt:手作業でコード化されたUIとUIビルダーをリンクするには?

ここでは、私が試したものです私が各ボタンの親をウィジェットに設定したとしても?すべてのヘルプはapprecだろう

main.cppに

#include "window.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Window w; 
    w.show(); 

    return a.exec(); 
} 

#ifndef WINDOW_H #define WINDOW_H #include <QWidget> #include <QPushButton> namespace Ui { class Window; } class Window : public QWidget { Q_OBJECT public: explicit Window(QWidget *parent = 0); ~Window(); private: Ui::Window *ui; static const int tiles = 50, height = 600, width = 500; QVector< QVector<QPushButton*> > cells; }; #endif // WINDOW_H 

window.h window.cpp

#include "window.h" 
#include "ui_window.h" 

Window::Window(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Window) 
{ 
    ui->setupUi(this); 
    this->resize(width, height); 

    int j = 0; 
    for(auto &row : cells) 
    { 
     int i = 0; 
     for(auto &col : row) 
     { 
      col = new QPushButton(this); 
      col->setGeometry(i, j, tiles, tiles); 
      i += tiles; 
     } 

     j += tiles; 
    } 
} 

Window::~Window() 
{ 
    delete ui; 
    for(auto &row : cells) 
    { 
     for(auto &col : row) 
     { 
      delete col; 
     } 

    } 
} 

iated。

答えて

2

ベクターは空のため、何も繰り返しません。これらを手動で管理する代わりに、グリッドレイアウトを活用することができます。

悲しいことに、すべての手動メモリ管理とジオメトリ管理が不必要に複雑になっています。それは不要です。あなたが言いたいレイアウトにウィジェットを追加するだけです。そしてそれでも、私はどのようにレイアウトを.uiファイルに降格させるのか分からないので、レイアウトは空でなければなりません。だからはい:間隔を設定することはできますが、コードを実行するまでは表示されません。だからあなたが私たちに何も言わない他の要素がない限り、無意味な運動のように思えます。

可能な限り簡略化するための最小限の例ですが、詳細はthis answer and the links thereinを参照してください。

// https://github.com/KubaO/stackoverflown/tree/master/questions/button-grid-43214317 
#include <QtWidgets> 

namespace Ui { class Window { 
public: 
    // Approximate uic output 
    QGridLayout *layout; 
    void setupUi(QWidget * widget) { 
     layout = new QGridLayout(widget); 
    } 
}; } 

class Window : public QWidget 
{ 
    Q_OBJECT 
    Ui::Window ui; 
    QPushButton * buttonAt(int row, int column) { 
     auto item = ui.layout->itemAtPosition(row, column); 
     return item ? qobject_cast<QPushButton*>(item->widget()) : nullptr; 
    } 

public: 
    explicit Window(QWidget *parent = {}); 
}; 

Window::Window(QWidget *parent) : QWidget(parent) { 
    ui.setupUi(this); 
    for (int i = 0; i < 5; ++i) 
     for (int j = 0; j < 6; ++j) 
     { 
     auto b = new QPushButton(QStringLiteral("%1,%2").arg(i).arg(j)); 
     ui.layout->addWidget(b, i, j); 
     } 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Window w; 
    w.show(); 
    return a.exec(); 
} 
#include "main.moc" 
関連する問題