Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt GUI design programmatically

I'm try to create a GUI application.

The main window, a QMainWindow, contains 9 labels with fixed size and also the size of the main window.

I tried to make it programmatically without Qt GUI Designer. The project is built without error but I cannot see any label nor layout shown on the main window. it's just blank.

Here is my source code:

WCwindow::WCwindow()
{
   // initialize widgets with text
   CAM111 = new QLabel("CAM 01");
   CAM121 = new QLabel("CAM 02");
   CAM131 = new QLabel("CAM 03");

   CAM211 = new QLabel("CAM 04");
   CAM221 = new QLabel("CAM 05");
   CAM231 = new QLabel("CAM 06");

   CAM311 = new QLabel("CAM 07");
   CAM321 = new QLabel("CAM 08");
   CAM331 = new QLabel("CAM 09");

   CAM111->setFixedSize(wcW,wcH);
   CAM121->setFixedSize(wcW,wcH);
   CAM131->setFixedSize(wcW,wcH);
   CAM211->setFixedSize(wcW,wcH);
   CAM221->setFixedSize(wcW,wcH);
   CAM231->setFixedSize(wcW,wcH);
   CAM311->setFixedSize(wcW,wcH);
   CAM321->setFixedSize(wcW,wcH);
   CAM331->setFixedSize(wcW,wcH);

   QGridLayout *layout = new QGridLayout;
   layout->addWidget(CAM111,0,0);
   layout->addWidget(CAM121,0,1);
   layout->addWidget(CAM131,0,2);

   layout->addWidget(CAM211,1,0);
   layout->addWidget(CAM221,1,1);
   layout->addWidget(CAM231,1,2);

   layout->addWidget(CAM311,2,0);
   layout->addWidget(CAM321,2,1);
   layout->addWidget(CAM331,2,2);

   setLayout(layout);

   setWindowTitle("Camera Window");
   setFixedSize(1000, 800);

}

of course, the class is initialized and evoked in main.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    WCwindow *WCwin = new WCwindow;

    WCwin->show();

    return app.exec();
}

what kind of bug am I having??

like image 547
TSL_ Avatar asked Aug 06 '12 08:08

TSL_


People also ask

How do I use Qt Designer for GUI development?

In this tutorial, you learned how to: 1 Install Qt Designer on your system 2 Decide when to use Qt Designer vs hand code your GUIs 3 Build the GUI of an application’s main window using Qt Designer 4 Create and lay out the GUI of your dialogs with Qt Designer 5 Use Qt Designer’s .ui files in your GUI applications More ...

Is it possible to dynamically load UI files in Qt Designer?

However, it has one drawback: every time you modify the GUI with Qt Designer, you need to generate the code again. The second approach takes advantage of uic.loadUi () to dynamically load the content of a .ui file into your application. This approach is suitable when you’re working with small GUIs that don’t involve substantial loading time.

Why choose Qt?

Why Choose Qt? The Qt Company announces acquisition of Axivion GmbH. Learn more ☓ Qt Design Studio is a UI composition tool that turns design visions into functional products - it's the place where everything comes together.

What is the difference between PyQt and Qt Designer?

One last difference between using Qt Designer and hand coding a GUI is that you need to run an extra step when using Qt Designer: translating .ui files into Python code. With PyQt, you can build main window–style and dialog-style applications.


2 Answers

The code below works fine. The problem was in the code you weren't showing. When you use a QMainWindow, as you've eventually admitted to doing, you need to set its centralWidget with a new widget that you construct.

// main.cpp
#include <QVector>
#include <QMainWindow>
#include <QLabel>
#include <QGridLayout>
#include <QApplication>

class WCwindow : public QMainWindow
{
public:
    WCwindow();
private:
    QVector<QLabel*> cams;
    QLabel* cam(int r, int c) const {
        return cams[r*3 + c];
    }
};

WCwindow::WCwindow()
{
    QGridLayout *layout = new QGridLayout;

    for (int i = 1; i < 10; ++ i) {
        QLabel * const label = new QLabel(QString("CAM %1").arg(i, 2, 10, QLatin1Char('0')));
        label->setFixedSize(200, 50);
        layout->addWidget(label, (i-1) / 3, (i-1) % 3);
        cams << label;
    }

    QWidget * central = new QWidget();
    setCentralWidget(central);
    centralWidget()->setLayout(layout);

    setWindowTitle("Camera Window");
    setFixedSize(1000, 800);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    WCwindow win;
    win.show();
    return app.exec();
}
like image 123
Kuba hasn't forgotten Monica Avatar answered Jan 02 '23 13:01

Kuba hasn't forgotten Monica


Is WCwindow a subclass of QMainWindow? In that case i would advise to remove the layout from your window in the GUI editor by clicking the "break layout" button in the top bar, then use the following:

//setup all your labels and layout ...

//creating a QWidget, and setting the WCwindow as parent
QWidget * widget = new QWidget(this); 

//set the gridlayout for the widget
widget->setLayout(layout); 

//setting the WCwindow's central widget
setCentralWidget(widget);
like image 32
Balázs Édes Avatar answered Jan 02 '23 13:01

Balázs Édes