How to set QMDIArea background as transparent in QT? - qt

I have QMDIArea and inside it I have added a QMDISubWindow. I need QMDIArea to be completely transparent. By default it is displayed in grey color.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMdiArea area = new QMdiArea();
area->setStyleSheet("background:transparent;");
area->setAttribute(Qt::WA_TranslucentBackground);
this->setCentralWidget(area);
MyChildScreenDialog *dlg = new MyChildScreenDialog ();
area->addSubWindow(dlg );
}
But unfortunatlly, setting background:transaprent and setting attribute Qt::WA_TranslucentBackground won't work in QMdiArea.
Can we make QMdiArea as transparent? What modification we need to do in above code?

I could able to resolve this by below code.
area->setBackground(QBrush(Qt::transparent));

Using only QSS, this is the way to go:
QMdiArea {
qproperty-background: transparent;
}

Related

Change property of random element in QListWidget

I have 5 QProgressBars in a QListWidget (ui->listWidget). How can I access the third QProgressBar element and change its value ex. ( progressBar->setValue(40) )
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
a = new QPushButton(this);
connect(a, SIGNAL (clicked()),this, SLOT (clickedSlot()));
}
void MainWindow::clickedSlot()
{
QProgressBar *prog = new QProgressBar(this);
QListWidgetItem *it;
it = new QListWidgetItem(ui->listWidget);
ui->listWidget->insertItem(ui->listWidget->size().height(),it);
it->setSizeHint(QSize(200,50));
ui->listWidget->setItemWidget(it, prog);
}
The following code will obtain the third element in the list and set the progress to 40%.
QProgressBar *bar = qobject_cast<QProgressBar*>(ui->listWidget->itemWidget(pList->item(2)));
if (bar)
bar->setValue(40);
qobject_cast will safely cast the QWidget to QProgressBar, only if the widget is indeed a QProgressBar. If you are sure the third element is a QProgressBar, you can omit the if test if(bar).
See the qt documentation QListWidget and qobject_cast for more information.
Create the definition for the QProgressBar(s) in the class header file, then you can connect things to the setValue slot, or access them directly.
It seems odd to be adding ProgressBars to QListWidgetItems... wouldn't QHBoxLayout be more suitable?

QDockWidget will not show contents

I am attempting to create a specialised QDockWidget, with some contents, that I can use in other Qt5 UIs. To do this, I have created a QDockWidget subclass complete with a UI form, called SpecialDockWidget. The contents (a QTreeWidget) are added in the UI form.
In my main UI, I have added SpecialDockWidget as a QDockWidget promotion, have promoted the desired dock widget, and everything compiles OK. However, when I run the application my promoted dock widget contains the title of the SpecialDockWidget in its title bar, but the contents remain empty. This only happens if the dock widget is made part of the main UI (whether floating or attached), and the dock widget displays the contents successfully if it is instantiated on its own as a top-level widget.
The Qt documentation says the following with regards to QDockWidget::setWidget():
If the dock widget is visible when widget is added, you must show() it explicitly.
Note that you must add the layout of the widget before you call this function; if not, the widget will not be visible.
I have tried calling show() on both the SpecialDockWidget and the contents, and have set the layout myself, but the contents still don't show up.
Can anyone tell me what I might be doing wrong?
EDIT: Some photos showing what's going on:
Dock widget code:
#include "specialdockwidget.h"
#include "ui_specialdockwidget.h"
#include <QVBoxLayout>
SpecialDockWidget::SpecialDockWidget(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::SpecialDockWidget)
{
ui->setupUi(this);
}
SpecialDockWidget::~SpecialDockWidget()
{
delete ui;
}
Main window code:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// This produces the top-level dock widget
// SpecialDockWidget* w = new SpecialDockWidget();
// w->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
The QDockWidget is created in the Designer so it's not very clear how the tree is added to the QDockWidget. If the tree is simply a child of the QDockWidget it's not correct. You must add the tree to the QDockWidget using QDockWidget::setWidget().
I suggest to not use the Designer to create a subclass of QDockWidget because it seems not possible to add the content correctly. You can do something like this instead.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDockWidget *dw = new QDockWidget(this);
QTreeWidget* tw = new QTreeWidget(dw);
dw->setWidget(tw);
addDockWidget(Qt::LeftDockWidgetArea, dw);
dw->show();
}
Of course, if you need to put inside a dock widget a more complex widget, you can create the content with the Designer as a simple QWidget subclass and add it to the dock widget in the same way.
I think your main window's constructor should look like, for example:
MainWindow::MainWindow(QWidget *parent)
:
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
SpecialDockWidget *w = new SpecialDockWidget();
// Add dock widget to the specified area of main window.
addDockWidget(Qt::LeftDockWidgetArea, w);
}

Change QWizard buttons size

I am trying to do something that looks easy, but I cannot make it working. I want to make buttons bigger in my QWizard. Here is the code :
#include "wizard.h"
#include "ui_wizard.h"
#include "QAbstractButton"
Wizard::Wizard(QWidget *parent) :
QWizard(parent),
ui(new Ui::Wizard)
{
ui->setupUi(this);
QRect rect = this->button(QWizard::NextButton)->geometry();
this->button(QWizard::NextButton)->setGeometry(rect.x(), rect.y(), rect.width(), 40);
rect = this->button(QWizard::CancelButton)->geometry();
this->button(QWizard::CancelButton)->setGeometry(rect.x(), rect.y(), rect.width(), 40);
rect = this->button(QWizard::BackButton)->geometry();
this->button(QWizard::BackButton)->setGeometry(rect.x(), rect.y(), rect.width(), 40);
}
Wizard::~Wizard()
{
delete ui;
}
This code does nothing. Is it possible to change the geometry of the buttons? Or it is forbidden?
Thank you
Better is to customize user interface using QSS (Qt Style Sheet). You can read your qss file and setup stylesheet for the whole application using QApplication::setStyleSheet().
Also you can setup qss programmatically (not the best practics).
setStyleSheet("QAbstractButton { height: 50px }");
What sets height for all buttons on the widget.
In the worst case you can try this:
button(QWizard::CancelButton)->setStyleSheet("height: 50px");

QDockWidget Content bug with titlebar

Here is my problem: I created a QDockWidget and put a QGraphicsView in it, while it is floating everything shows up correctly, but if Dock it somewhere, the starting X and Y of my content is on the titlebar of the QDockWidget. Obviously, it should be under:
tilesetWindow = new QDockWidget(tr("Tileset"), this);
tilesetWindow->setMinimumSize(256,256);
tilesetWindow->setFloating(true);
connect(tilesetWindow, SIGNAL(visibilityChanged(bool)), this, SLOT(triggeredTileset()));
tilesetViewer = new QGraphicsView(tilesetWindow);
tilesetViewer->resize(256,256);
tilesetViewer->show();
An image to illustrate this: http://img86.xooimage.com/files/d/7/6/problem-391a96a.png
I've tried to put the QGraphicsView in a container and then in the QDockWidget but had the same result as above. it's the only place where I write code for the QDockWidget.
How can I make it start at the right place when it is Docked?
Edit:
I tried in a new QtProject and made a QDockWidget with a QTextBrowser in it and had the same bug:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDockWidget *dock = new QDockWidget(this, 0);
dock->setFloating(true);
QTextBrowser *t = new QTextBrowser(dock);
t->show();
}
I'm missing something I think...
Qt Creator 2.4.1
Based on Qt 4.7.4 (32 bit)
After setting the QDockWidget as the Parent, you also need to set the QDockWidget's Widget as the QGraphicsView, or any other you want.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDockWidget *dock = new QDockWidget(this, 0);
dock->setFloating(true);
QTextBrowser *t = new QTextBrowser(dock);
dock->setWidget(t);
}

QT4 using QMdiArea and QScrollArea strange usage trouble

Here is what I am doing: mainwindow with MdiArea, and I add a scrollarea widget (which contains a image label) to MdiArea as a subwindow. It doesn't work (the picture doesn't show).
Here is my code:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QScrollArea sa;
QPixmap *image = new QPixmap("2.jpg");
QLabel* imageLabel = new QLabel();
imageLabel->setPixmap(*image);
sa.setWidget(imageLabel);
sa.show();
ui->mdiArea->addSubWindow(&sa);
}
But when I use a QLabel as subwindow directly, i.e. replace the last line with:
ui->mdiArea->addSubWindow(imageLabel);
it works perfectly.
Anyone know why this is happening?
QScrollArea sa;
This declares a QScrollArea on the stack. It gets destroyed immediately after the constructor finishes. Allocate it with new like you do for the other widgets and it should start working.
QScollArea *sa = new QScrollArea;
...
ui->mdiArea->addSubWindow(sa);
(And change the sa. to sa->.)

Resources