code
News::News(QWidget *parent) :
QDialog(parent),
ui(new Ui::News)
{
ui->setupUi(this);
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(ui->webView,SIGNAL(linkClicked(QUrl)),this,SLOT(openUrl(QUrl)));
}
void News::openUrl(QUrl url){
if(the new window)
QDesktopServices::openUrl(url);
}else{
ui->webView->load(url);
}
}
How do I judge instead of a new window link function openUrl?
How I'm going to write this code、?
thanks!!!
You need to inherit your own class from QWebView and reimplement the createWindow() method. http://doc.qt.digia.com/qt/qwebview.html#createWindow
Related
Currently I have a QComboBox who's color I want to change when the user makes a selection. To do this I have function called on the activated signal which calls setStyleSheet
void comboBoxActivated(int i){
myComboBox -> setStyleSheet("border-width:2px; border-style:solid; border-color:red;");
}
This however causes the combo box to be stuck open on my screen and the only way to get rid of it is close the application. Is there some issue with changing the style using this function? For reference I am running Ubuntu and QT 4.8
This code in windows works perfect:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->comboBox->addItem("item1");
ui->comboBox->addItem("item2");
ui->comboBox->addItem("itme3");
connect(ui->comboBox, SIGNAL(activated(int)),
this, SLOT(comboBoxActivated(int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::comboBoxActivated(int i){
ui->comboBox -> setStyleSheet("border-width:2px; border-style:solid; border-color:red;");
}
For some reason if I force the box to open and close the change will apply without issue
void comboBoxActivated(int i){
myComboBox -> setStyleSheet("border-width:2px; border-style:solid; border-color:red;");
myComboBox -> showPopup();
myComboBox -> hidePopup();
}
I am new to Qt. I took an example from here http://doc.qt.io/qt-5/qtmultimediawidgets-player-example.html.
Now I want to integrate the player in the main window. I created a Qt Widgets application project, I thought, that I would just have to edit the main window code:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Player* player;
MainWindow::setCentralWidget(player);
}
But it doesn't work and I get the following error:
Starting /home/***/Documents/build-player-Desktop-Debug/player...
The program has unexpectedly finished.
/home/***/Documents/build-player-Desktop-Debug/player crashed
How can I integrate a custom widget which is written in code, without ui in a main window? Thank you in advance.
In your own MainWindow class you can add a widget to the layout of that MainWindow:
MyMainWindow::MyMainWindow(QWidget *parent) :
...
{
this->ui->setupUi(this);
QLabel *myLabel = new QLabel();
this->layout()->addWidget(myLabel);
}
Well, player can't be placed on the window if it is not initialized.
Write something like that :
Player *player = new Player();
I usually add a QWidget (or whatever widget type I'm extending) to my .ui-file in the designer and then promote it to the actual derived type. See the Qt docs for more info on promoting widgets. This means that I can set the base widget's properties and design the window as usual but still get an instance of my special class when the UI is instantiated.
MainWindow:MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
SomeStupidWidget *ssw = new SomeStupidWidget(this); /* important! don't forget about passing "this" as argument, otherwise this could cause a memory leak(Qt handles object's lifetime by means of it's "owner" mechanism)*/
layout()->addWidget(ssw);
}
I have the following code to display a pushbutton, i am new to qt and can't figure out why its not working.
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtWidgets>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QWidget* wdg = new QWidget(this);
QPushButton *button = new QPushButton(wdg);
button->setText(tr("something"));
setCentralWidget(wdg);//line 1
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
if i remove line1 then the button is being displayed but it is not clickable.
When ui->setupUi(this); is called, the user interface that is created in Qt designer stored in .ui file is initialized. It constructs the widgets and calls setCentralWidget internally. So when it is called the central widget is replaced by the one you set.
Either make the user interface by your own and ignore ui->setupUi(this); or first call ui->setupUi(this); in the constructor and do the rest of initializations by your own if you wish.
I have a MainWindow class and Another class. Another class has method createView that create new QGraphicsView. This method I call from MainWindow and I also want to layout this view on my form. It looks like:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)) {
...
AnotherClass object(this);
object.createView();
...
}
...
void AnotherClass::createView() {
QGraphicsView *gv= new QGraphicsView(mainWindow); // mainWindow - pointer to MainWindow object
gv->show();
}
But it doesn't work so good... actually it does't work at all. And yes, I save pointer on MainWindow object in my Another class as mainWindow, that I take from Another class constructor.
If use
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)) {
...
QGraphicsView *gv= new QGraphicsView(this);
gv->show();
...
}
It will work fine, but this solution doesn't satisfied me.
Problem was in creating variable on stack.
Trying to add text to QGraphicsView:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QGraphicsScene scene;
scene.addText("Hello, world!");
ui->graphicsView->setScene(&scene);
}
But when the project running, there is nothing on the QGraphicsView.
Your QGraphicsScene scene is a local variable and it is deleted immeadiately after the Widget's constructor has been executed.
Change the scene to a private member variable of the Widget class.