I need to auto generate some UI forms in code to display message contents.
I want to use QToolbox, with an item for each message type. I then want to add labels and line edit to the contents of each tab, depending on the message protocol. I cannot seem to programaticaly add widget items to the toolbox item.
Below is my current code segment. The ui->frame is just a container for the toolbox. I will worry later about layout.
In my code, I create a frame and then some labels with parent set to the frame. Then I add the frame as an item to the toolbox.
QToolBox *qtbMainToolbox = new QToolBox(ui->frame);;
qtbMainToolbox->setGeometry(0,0,2000,900);
QFrame *frm1 = new QFrame;
QLabel *lbl1 = new QLabel(frm1);
QLabel *lbl2 = new QLabel(frm1);
QLabel *lbl3 = new QLabel(frm1);
QLabel *lbl4 = new QLabel(frm1);
iRetVal - qtbMainToolbox->addItem(frm1 ,"Test");
There is no visible element in your widgets; icon or any text.
You have to Set icon or Text to Your QLabel.
QToolBox *qtbMainToolbox = new QToolBox(ui->frame);;
qtbMainToolbox->setGeometry(0,0,2000,900);
QFrame *frm1 = new QFrame;
QLabel *lbl1 = new QLabel("Hello World",frm1);
iRetVal - qtbMainToolbox->addItem(frm1 ,"Test");
try above code.
Related
I've created a a widget in which I've placed two buttons using a layout and placed it inside a table widget's cell. The thing is that I'm changing the size of the table and I want to shift the placement of the widget without deleting them and re-initializing them from the beginning because I already assigned them actions on click (I think that the application would crash in this situation)
Code:
btn = new QPushButton[horzHeaders.size()];
btn[j].setParent(ui->tableWidget);
btn[j].setIcon(QIcon("./save.png"));
btn[j].setVisible(true);
btn_Load = new QPushButton[horzHeaders.size()];
btn_Load[j].setParent(ui->tableWidget);
btn_Load[j].setIcon(QIcon("./upload.png"));
btn_Load[j].setVisible(true);
lay = new QHBoxLayout[horzHeaders.size()];
lay[j].addWidget(&btn[j]);
lay[j].addWidget(&btn_Load[j]);
QWidget *w = new QWidget[horzHeaders.size()];
w[j].setLayout(&lay[j]);
ui->tableWidget->setCellWidget(j,vertHeaders.size() - 1, &w[j]);
You can add and remove widgets from a layout anytime you want
QWidget *widget = new QWidget();
QPushButton *button = new QPushButton();
QHBoxLayout *Hbox = new QHBoxLayout();
QVBoxLayout *Vbox= new QVBoxLayout();
Hbox->addWidget(button);
// use it till the window is resized
//and then check with an if-statement if the window is resized or not
Hbox->removeWidget(button); // remove from the button from layout
layout()->removeAt(widget); //remove the widget's current layout
Vbox->addWidget(button); // add button widget to vertical layout
widget->setLayout(Vbox); // Give it a new layout
widget->setLayout(Vbox);
If this didn't answer your question then ask in the comments.
I want to add a group widget to the corner of tab widget. so i wrote these below, but doesn't work.
auto layout = new QHBoxLayout;
auto text = new QTextEdit;
auto button = new QPushButton("find");
layout->addWidget(text);
layout->addWidget(button);
auto group = new QGroupBox;
group->setLayout(layout);
stageTabWidget->setCornerWidget(group);
problem solved! It turns out that the group was too small to show the widget. Change the style of the group with this line group->setStyleSheet("QGroupBox{border:0px;padding-top:-10px;padding-bottom:-10px;}"); will be ok.
I'm using QT 5.4.2 and trying to create a small panel at the bottom
of a subclassed QTreeWidget.
Here is the code:
void HmiScenarioAutoscriptPanel::searchEmitter() {
QWidget *child = new QWidget(ui->emitterTreeWidget);
//QMainWindow* child = new QMainWindow;
QLabel *labelSearch = new QLabel("Search");
QLineEdit *lineSearch = new QLineEdit();
lineSearch->setFixedSize(100, 20);
QHBoxLayout* layout = new QHBoxLayout(ui->emitterTreeWidget);
layout->setAlignment(Qt::AlignBottom);
layout->addWidget(child);
layout->addWidget(labelSearch);
layout->addWidget(lineSearch);
}
The label and search field correctly appear at the bottom of the tree,
however the fields overlap with the tree nodes (see image below).
Any idea why this behavior?
Ciao
Alf
enter image description here
It is not recommended to set layout on the tree widget. It is like other controls like a button, label etc..
I see that you are using designer. Add a blank widget (searchWidget) under the tree widget and then
void HmiScenarioAutoscriptPanel::searchEmitter() {
QWidget *child = new QWidget(ui->searchWidget);
//QMainWindow* child = new QMainWindow;
QLabel *labelSearch = new QLabel("Search", searchWidget);
QLineEdit *lineSearch = new QLineEdit(searchWidget);
lineSearch->setFixedSize(100, 20);
QHBoxLayout* layout = new QHBoxLayout(ui->searchWidget);
layout->setAlignment(Qt::AlignBottom);
layout->addWidget(child);
layout->addWidget(labelSearch);
layout->addWidget(lineSearch);
}
Just out of curiosity, why don't you add these using the designer as well?
I have a stacked widget on which I have a QLabel. I display an image on this label. I want to zoom and pan this image and I am trying to use the QGraphicsView technique. However a new window opens.
This is what I am doing.
scene = new QGraphicsScene(this);
view = new QGraphicsView(this);
QPixmap pix("/root/Image);
label->setPixmap(pix);
scene->addWidget(label);
view->setScene(scene);
view->setDragMode(QGraphicsView::scrollHandDrag);
view->show();
Can someone please suggest me what I should do. I want the label to act like the QGraphicsView.
Thank You :)
You create a scene and view and add the label to the scene, then tell the view to show itself with: -
view->show()
If, as you state, you want the QGraphicsView on the label, don't add the label to the scene, but add the QGraphicsView to the label: -
QLabel* pLabel = new QLabel(mainWindow); // setting mainWindow as the parent
QGraphicsView* pView = new QGraphicsView(pLabel) // set the label as the parent of the view.
You do not need to call show, as the label will handle that for you, assuming the label is on a Widget that is already displayed.
Now, instead of setting the pixmap on the label, create a pixmap in the scene with: -
pScene->addPixmap(pixmap);
I understand how to add a scrollArea to a particular widget. However in my case Qwidget has multiple child widgets and these are all set using QVBoxLayout. Now how can I add a scroll bar in this case? Here QWidget is not the center widget, its one of the pages of the TabWidget. My code looks like:
QTabWIdget *center = new QTabWidget; setCentralWIdget(center);
xTab = new QWidget;
formLayout = new QFormLayout; formLayout->addWidget(...); formLayout->addWidget(...); formLayout->addWidget(...); formLayout->addWidget(...);
xTab->setLayout(formLayout);
Now how can I set the scrollBar to xTab? I tried using
scrollArea = new QScrollArea;
scrollArea->setWidget(xTab);
however, this isn't working.
Any idea/suggestions are helpful and appreciated.
Have you tried using QScrollArea as the tab page?
QTabWIdget *center = new QTabWidget; setCentralWIdget(center);
xTab = new QScrollArea;
formLayout = new QFormLayout; formLay....
xTab->setLayout(formLayout);
center->addTab(xTab, "XXX Tab");
I had success using the following:
scroll=new QScrollArea(mainWindow->centralWidget);
scroll->setGeometry(mainWindow->tabWidget->geometry());
scroll->setWidget(mainWindow->tabWidget);
scroll->show();
The QScrollArea defines where the scrollable widget will appear. If parent is 0, it's a non-modal window. setGeometry sets the QScrollArea instance to the desired dimensions (that of the tab). setWidget defines what widget the QScrollArea will actually be scrolling.