Skip to content

General and Desktop

This is where all the desktop OS and general Qt questions belong.
83.6k Topics 457.7k Posts
  • QTableView + QStandardItemModel + custom delegate = strange behaviour

    Solved tableview delegate
    3
    0 Votes
    3 Posts
    880 Views
    artwawA
    @SGaist You are, as usual, right and I am the absolute moron :D I forgot to take into the account starting point of the cell in paint... Too much time has passed since I had to write the delegate it seems. The solution of the problem was correcting the drawPixamp starting point (add opt.rec.x() and opt.rect.y() respectively): painter-drawPixmap(QPoint(opt.rect.x()+opt.rect.width()/2,opt.rect.y()+opt.rect.height()/3),px.scaled(opt.rect.width(),opt.rect.height()/2,Qt::KeepAspectRatio,Qt::SmoothTransformation)); Thank you for this quick reminder! Cheers, A.
  • QLabels and QMainWindow have different size on app executing and design view

    Unsolved
    2
    0 Votes
    2 Posts
    132 Views
    SGaistS
    Hi, Are you using layouts to build your UI ?
  • QtDesigner & signal emit on press/etc?

    Unsolved qtdesigner signal & slot signal
    4
    0 Votes
    4 Posts
    892 Views
    mrjjM
    Hi On the bright side, when you do declare forward signals, you are doing it just right as accessing widgets left and right produces hard to maintain code that breaks easily. So by being "forced" to surface the external needed data via signals, you define an interface that will hold, even if you refactor the internal widgets. The rest of the app will remain unaffected. \o/
  • Cannot get any query output from executable "/opt/Qt/6.2.2/gcc_64/bin/qmake"

    Unsolved
    25
    0 Votes
    25 Posts
    5k Views
    JonBJ
    @Jorge_Adan See the discussion now going on in https://forum.qt.io/topic/132610/qtcreator-6-0-can-t-start, I think it's same as yours?
  • How to deploy an QT App from Windows to Linux?

    Solved
    5
    0 Votes
    5 Posts
    5k Views
    JonBJ
    @pachisuro4096 For example, I fetched VirtualBox (you can Google, it's easy to find) and put on my Windows (7) host. Then I downloaded the latest Ubuntu "image" from the web, and followed instructions to install that into the VB as guest OS. Now you have a running Linux any time you want as a virtual machine on your Windows box. You can boot into it, run Linux, do your development there (in a window, you can still use Windows for everything else). It's quite fun :) There are other choices than these, but this is (an example of) what having a Linux VM on a Windows box is like.
  • How to gracefully AlignHCenter QLineEdit text with clearButtonEnabled?

    Solved
    3
    0 Votes
    3 Posts
    382 Views
    S
    After a couple hours of browsing Qt sources I finally found my solution: SmartLineEdit::SmartLineEdit(QWidget* parent) : QLineEdit(parent) { ... _button = findChild<QToolButton*>(); _button->installEventFilter(this); auto iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this); auto margin = iconSize / 4; auto widgetWidth = iconSize + 6; _textMargin = margin+widgetWidth; } bool SmartLineEdit::eventFilter(QObject *watched, QEvent *event) { if (watched == _button) { if (event->type() == QEvent::Show) setTextMargins(_textMargin, 0, 0, 0); if (event->type() == QEvent::Hide) setTextMargins(0, 0, 0, 0); } return false; } Event filter is needed because ClearButton doesn't appear/disappear immediately, it takes some time to perform its animation.
  • This topic is deleted!

    Unsolved
    1
    0 Votes
    1 Posts
    9 Views
    No one has replied
  • Conversion from QByteArray to int

    Unsolved
    15
    0 Votes
    15 Posts
    25k Views
    S
    @JonB OK, thanks a lot. I'm appriciate your answer. I will create new topic. :)
  • How to use QTcpSocket stays in ConnectingState after reconnection.

    Unsolved
    11
    0 Votes
    11 Posts
    2k Views
    JonBJ
    @swansorter If you have not set QTcpSocket::ReuseAddressHint at the server side, prior to bind(), the server will not accept a second connection from any client (on the same client IP address), while a client is connected to the server. (There may be a period of time after "reported disconnection" when the client is still connected so the server cannot reuse the address.) So.... have you set this at the server side, in the correct place? Otherwise you may show your client connection code to verify you are not specifying a client-side port.
  • how to embed Ogre3D in qt5 ?

    Solved qt5.11 ogre widgets
    9
    0 Votes
    9 Posts
    2k Views
    timob256T
    main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } QTOgreWindow.cpp #include "QTOgreWindow.h" #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) #include <Compositor/OgreCompositorManager2.h> #endif /* Note that we pass any supplied QWindow parent to the base QWindow class. This is necessary should we need to use our class within a container. */ QTOgreWindow::QTOgreWindow(QWindow *parent) : QWindow(parent) , m_update_pending(false) , m_animating(false) , m_ogreRoot(NULL) , m_ogreWindow(NULL) , m_ogreCamera(NULL) , m_cameraMan(NULL) { setAnimating(true); installEventFilter(this); m_ogreBackground = Ogre::ColourValue(0.0f, 0.5f, 1.0f); } /* Upon destruction of the QWindow object we destroy the Ogre3D scene. */ QTOgreWindow::~QTOgreWindow() { if (m_cameraMan) delete m_cameraMan; delete m_ogreRoot; } /* In case any drawing surface backing stores (QRasterWindow or QOpenGLWindow) of Qt are supplied to this class in any way we inform Qt that they will be unused. */ void QTOgreWindow::render(QPainter *painter) { Q_UNUSED(painter); } /* Our initialization function. Called by our renderNow() function once when the window is first exposed. */ void QTOgreWindow::initialize() { /* As shown Ogre3D is initialized normally; just like in other documentation. */ #ifdef _MSC_VER m_ogreRoot = new Ogre::Root(Ogre::String("plugins" OGRE_BUILD_SUFFIX ".cfg")); #else m_ogreRoot = new Ogre::Root(Ogre::String("plugins.cfg")); #endif Ogre::ConfigFile ogreConfig; /* Commended out for simplicity but should you need to initialize resources you can do so normally. ogreConfig.load("resources/resource_configs/resources.cfg"); Ogre::ConfigFile::SectionIterator seci = ogreConfig.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName); } } */ const Ogre::RenderSystemList& rsList = m_ogreRoot->getAvailableRenderers(); Ogre::RenderSystem* rs = rsList[0]; /* This list setup the search order for used render system. */ Ogre::StringVector renderOrder; #if defined(Q_OS_WIN) renderOrder.push_back("Direct3D9"); renderOrder.push_back("Direct3D11"); #endif renderOrder.push_back("OpenGL"); renderOrder.push_back("OpenGL 3+"); for (Ogre::StringVector::iterator iter = renderOrder.begin(); iter != renderOrder.end(); iter++) { for (Ogre::RenderSystemList::const_iterator it = rsList.begin(); it != rsList.end(); it++) { if ((*it)->getName().find(*iter) != Ogre::String::npos) { rs = *it; break; } } if (rs != NULL) break; } if (rs == NULL) { if (!m_ogreRoot->restoreConfig()) { // if (!m_ogreRoot->showConfigDialog()) // OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, // "Abort render system configuration", // "QTOgreWindow::initialize"); } } /* Setting size and VSync on windows will solve a lot of problems */ QString dimensions = QString("%1 x %2").arg(this->width()).arg(this->height()); rs->setConfigOption("Video Mode", dimensions.toStdString()); rs->setConfigOption("Full Screen", "No"); rs->setConfigOption("VSync", "Yes"); m_ogreRoot->setRenderSystem(rs); m_ogreRoot->initialise(false); Ogre::NameValuePairList parameters; /* Flag within the parameters set so that Ogre3D initializes an OpenGL context on it's own. */ if (rs->getName().find("GL") <= rs->getName().size()) parameters["currentGLContext"] = Ogre::String("false"); /* We need to supply the low level OS window handle to this QWindow so that Ogre3D knows where to draw the scene. Below is a cross-platform method on how to do this. If you set both options (externalWindowHandle and parentWindowHandle) this code will work with OpenGL and DirectX. */ #if defined(Q_OS_MAC) || defined(Q_OS_WIN) parameters["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(this->winId())); parameters["parentWindowHandle"] = Ogre::StringConverter::toString((size_t)(this->winId())); #else parameters["externalWindowHandle"] = Ogre::StringConverter::toString((unsigned long)(this->winId())); parameters["parentWindowHandle"] = Ogre::StringConverter::toString((unsigned long)(this->winId())); #endif #if defined(Q_OS_MAC) parameters["macAPI"] = "cocoa"; parameters["macAPICocoaUseNSView"] = "true"; #endif /* Note below that we supply the creation function for the Ogre3D window the width and height from the current QWindow object using the "this" pointer. */ m_ogreWindow = m_ogreRoot->createRenderWindow("QT Window", this->width(), this->height(), false, &parameters); m_ogreWindow->setVisible(true); /* The rest of the code in the initialization function is standard Ogre3D scene code. Consult other tutorials for specifics. */ #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) const size_t numThreads = std::max<int>(1, Ogre::PlatformInformation::getNumLogicalCores()); Ogre::InstancingThreadedCullingMethod threadedCullingMethod = Ogre::INSTANCING_CULLING_SINGLETHREAD; if (numThreads > 1)threadedCullingMethod = Ogre::INSTANCING_CULLING_THREADED; m_ogreSceneMgr = m_ogreRoot->createSceneManager(Ogre::ST_GENERIC, numThreads, threadedCullingMethod); #else m_ogreSceneMgr = m_ogreRoot->createSceneManager(Ogre::ST_GENERIC); #endif m_ogreCamera = m_ogreSceneMgr->createCamera("MainCamera"); m_ogreCamera->setPosition(Ogre::Vector3(0.0f, 0.0f, 10.0f)); m_ogreCamera->lookAt(Ogre::Vector3(0.0f, 0.0f, -300.0f)); m_ogreCamera->setNearClipDistance(0.1f); m_ogreCamera->setFarClipDistance(200.0f); m_cameraMan = new OgreQtBites::SdkQtCameraMan(m_ogreCamera); // create a default camera controller #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) createCompositor(); #else Ogre::Viewport* pViewPort = m_ogreWindow->addViewport(m_ogreCamera); pViewPort->setBackgroundColour(m_ogreBackground); #endif m_ogreCamera->setAspectRatio( Ogre::Real(m_ogreWindow->getWidth()) / Ogre::Real(m_ogreWindow->getHeight())); m_ogreCamera->setAutoAspectRatio(true); Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); createScene(); m_ogreRoot->addFrameListener(this); } void QTOgreWindow::createScene() { /* Example scene Derive this class for your own purpose and overwite this function to have a working Ogre widget with your own content. */ m_ogreSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f)); #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) Ogre::Entity* sphereMesh = m_ogreSceneMgr->createEntity(Ogre::SceneManager::PT_SPHERE); #else Ogre::Entity* sphereMesh = m_ogreSceneMgr->createEntity("mySphere", Ogre::SceneManager::PT_SPHERE); #endif Ogre::SceneNode* childSceneNode = m_ogreSceneMgr->getRootSceneNode()->createChildSceneNode(); childSceneNode->attachObject(sphereMesh); Ogre::MaterialPtr sphereMaterial = Ogre::MaterialManager::getSingleton().create("SphereMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true); sphereMaterial->getTechnique(0)->getPass(0)->setAmbient(0.1f, 0.1f, 0.1f); sphereMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.2f, 0.2f, 0.2f, 1.0f); sphereMaterial->getTechnique(0)->getPass(0)->setSpecular(0.9f, 0.9f, 0.9f, 1.0f); //sphereMaterial->setAmbient(0.2f, 0.2f, 0.5f); //sphereMaterial->setSelfIllumination(0.2f, 0.2f, 0.1f); sphereMesh->setMaterialName("SphereMaterial"); childSceneNode->setPosition(Ogre::Vector3(0.0f, 0.0f, 0.0f)); childSceneNode->setScale(Ogre::Vector3(0.01f, 0.01f, 0.01f)); // Radius, in theory. #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) Ogre::SceneNode* pLightNode = m_ogreSceneMgr->getRootSceneNode()->createChildSceneNode(); Ogre::Light* light = m_ogreSceneMgr->createLight(); pLightNode->attachObject(light); pLightNode->setPosition(20.0f, 80.0f, 50.0f); #else Ogre::Light* light = m_ogreSceneMgr->createLight("MainLight"); light->setPosition(20.0f, 80.0f, 50.0f); #endif } #if OGRE_VERSION >= ((2 << 16) | (0 << 8) | 0) void QTOgreWindow::createCompositor() { /* Example compositor Derive this class for your own purpose and overwite this function to have a working Ogre widget with your own compositor. */ Ogre::CompositorManager2* compMan = m_ogreRoot->getCompositorManager2(); const Ogre::String workspaceName = "default scene workspace"; const Ogre::IdString workspaceNameHash = workspaceName; compMan->createBasicWorkspaceDef(workspaceName, m_ogreBackground); compMan->addWorkspace(m_ogreSceneMgr, m_ogreWindow, m_ogreCamera, workspaceNameHash, true); } #endif void QTOgreWindow::render() { /* How we tied in the render function for OGre3D with QWindow's render function. This is what gets call repeatedly. Note that we don't call this function directly; rather we use the renderNow() function to call this method as we don't want to render the Ogre3D scene unless everything is set up first. That is what renderNow() does. Theoretically you can have one function that does this check but from my experience it seems better to keep things separate and keep the render function as simple as possible. */ // Ogre::WindowEventUtilities::messagePump(); m_ogreRoot->renderOneFrame(); } void QTOgreWindow::renderLater() { /* This function forces QWindow to keep rendering. Omitting this causes the renderNow() function to only get called when the window is resized, moved, etc. as opposed to all of the time; which is generally what we need. */ if (!m_update_pending) { m_update_pending = true; QApplication::postEvent(this, new QEvent(QEvent::UpdateRequest)); } } bool QTOgreWindow::event(QEvent *event) { /* QWindow's "message pump". The base method that handles all QWindow events. As you will see there are other methods that actually process the keyboard/other events of Qt and the underlying OS. Note that we call the renderNow() function which checks to see if everything is initialized, etc. before calling the render() function. */ switch (event->type()) { case QEvent::UpdateRequest: m_update_pending = false; renderNow(); return true; default: return QWindow::event(event); } } /* Called after the QWindow is reopened or when the QWindow is first opened. */ void QTOgreWindow::exposeEvent(QExposeEvent *event) { Q_UNUSED(event); if (isExposed()) renderNow(); } /* The renderNow() function calls the initialize() function when needed and if the QWindow is already initialized and prepped calls the render() method. */ void QTOgreWindow::renderNow() { if (!isExposed()) return; if (m_ogreRoot == NULL) { initialize(); } render(); if (m_animating) renderLater(); } /* Our event filter; handles the resizing of the QWindow. When the size of the QWindow changes note the call to the Ogre3D window and camera. This keeps the Ogre3D scene looking correct. */ bool QTOgreWindow::eventFilter(QObject *target, QEvent *event) { if (target == this) { if (event->type() == QEvent::Resize) { if (isExposed() && m_ogreWindow != NULL) { m_ogreWindow->resize(this->width(), this->height()); } } } return false; } /* How we handle keyboard and mouse events. */ void QTOgreWindow::keyPressEvent(QKeyEvent * ev) { if(m_cameraMan) m_cameraMan->injectKeyDown(*ev); } void QTOgreWindow::keyReleaseEvent(QKeyEvent * ev) { if(m_cameraMan) m_cameraMan->injectKeyUp(*ev); } void QTOgreWindow::mouseMoveEvent( QMouseEvent* e ) { static int lastX = e->x(); static int lastY = e->y(); int relX = e->x() - lastX; int relY = e->y() - lastY; lastX = e->x(); lastY = e->y(); if(m_cameraMan && (e->buttons() & Qt::LeftButton)) m_cameraMan->injectMouseMove(relX, relY); } void QTOgreWindow::wheelEvent(QWheelEvent *e) { if(m_cameraMan) m_cameraMan->injectWheelMove(*e); } void QTOgreWindow::mousePressEvent( QMouseEvent* e ) { if(m_cameraMan) m_cameraMan->injectMouseDown(*e); } void QTOgreWindow::mouseReleaseEvent( QMouseEvent* e ) { if(m_cameraMan) m_cameraMan->injectMouseUp(*e); QPoint pos = e->pos(); Ogre::Ray mouseRay = m_ogreCamera->getCameraToViewportRay( (Ogre::Real)pos.x() / m_ogreWindow->getWidth(), (Ogre::Real)pos.y() / m_ogreWindow->getHeight()); Ogre::RaySceneQuery* pSceneQuery = m_ogreSceneMgr->createRayQuery(mouseRay); pSceneQuery->setSortByDistance(true); Ogre::RaySceneQueryResult vResult = pSceneQuery->execute(); for (size_t ui = 0; ui < vResult.size(); ui++) { if (vResult[ui].movable) { if (vResult[ui].movable->getMovableType().compare("Entity") == 0) { emit entitySelected((Ogre::Entity*)vResult[ui].movable); } } } m_ogreSceneMgr->destroyQuery(pSceneQuery); } /* Function to keep track of when we should and shouldn't redraw the window; we wouldn't want to do rendering when the QWindow is minimized. This takes care of those scenarios. */ void QTOgreWindow::setAnimating(bool animating) { m_animating = animating; if (animating) renderLater(); } bool QTOgreWindow::frameRenderingQueued(const Ogre::FrameEvent& evt) { m_cameraMan->frameRenderingQueued(evt); return true; } void QTOgreWindow::log(Ogre::String msg) { if(Ogre::LogManager::getSingletonPtr() != NULL) Ogre::LogManager::getSingletonPtr()->logMessage(msg); } void QTOgreWindow::log(QString msg) { log(Ogre::String(msg.toStdString().c_str())); } widget.cpp #include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { QTOgreWindow * ogreWindow = new QTOgreWindow (); ogreWindow->show (); } Widget::~Widget() { } plugin.cfg # Defines plugins to load # Define plugin folder PluginFolder=/usr/local/lib/OGRE # Define plugins # Plugin=RenderSystem_Direct3D9 # Plugin=RenderSystem_Direct3D11 Plugin=RenderSystem_GL Plugin=RenderSystem_GL3Plus Plugin=RenderSystem_GLES2 # Plugin=RenderSystem_Metal # Plugin=RenderSystem_Tiny Plugin=Plugin_ParticleFX Plugin=Plugin_BSPSceneManager # Plugin=Plugin_CgProgramManager Plugin=Codec_EXR Plugin=Codec_STBI # Plugin=Codec_FreeImage Plugin=Plugin_PCZSceneManager Plugin=Plugin_OctreeZone Plugin=Plugin_OctreeSceneManager Plugin=Plugin_DotScene # Plugin=Codec_Assimp [image: 74c07298-7b45-40ba-a0ee-9625176a7398.png] the first part of the answer at the top (failed to fit into one message)
  • How to set a QLabel keep showing above a QTabWidget

    Solved
    4
    0 Votes
    4 Posts
    194 Views
    Christian EhrlicherC
    Then don't put the label in the tabwidget but below...
  • A bug where the text color changes when the cursor changes?

    Solved
    2
    0 Votes
    2 Posts
    167 Views
    Christian EhrlicherC
    You only changed the color for QPalette::Active color group
  • When QSqlQuery .exec function called?

    Unsolved
    5
    0 Votes
    5 Posts
    369 Views
    D
    now i know whats my problem is thank you sir!
  • KDGantt Chart Click on Bars in Graph

    Solved
    5
    0 Votes
    5 Posts
    373 Views
    SGaistS
    @mchinand it can't otherwise it would have been implemented a long time ago.
  • Memory Leak due to Qt Designer components/widgets

    Solved
    7
    0 Votes
    7 Posts
    614 Views
    Pl45m4P
    @Bonnie said in Memory Leak due to Qt Designer components/widgets: QPainter does not subclass from QObject, so there won't be something like "parent" to it. oops... forgot about that :) Yeah, the usual way is to not new a QPainter in paintEvent, but allocate on stack, simply use it and let it go out of scope (like shown in QPainter documentation examples).
  • QTreeWidget error in documentation

    Solved
    2
    1 Votes
    2 Posts
    233 Views
    Christian EhrlicherC
    @Mummoc said in QTreeWidget error in documentation: Is this a known issue ? No Is there something I missed ? Not until now, thx https://codereview.qt-project.org/c/qt/qtbase/+/385114
  • 0 Votes
    3 Posts
    1k Views
    S
    I finaly found out how to handle this. See the SO post at https://stackoverflow.com/questions/70037430/qt-how-to-implement-panning-in-qgraphicsscene-with-two-fingers-on-laptop-trackp/70263559#70263559
  • QtMultimedia video buffer settings

    Unsolved
    2
    1 Votes
    2 Posts
    372 Views
    Kent-DorfmanK
    You are probably on the right track. Generally streamer packages have options to set the cache fill before playing. mplayer -cache is the one I'm most familiar with. I'd guess that the defaults are different based on the use of two different linux distros. Search the gstreamer docs, looking for the config file location and caching parameters. look at the dpkg info for gstreamer to see what the default config file is for the package on each distro and investigate there.
  • Replacing QMacCocoaViewContainer with QWidget::createWindowContainer().

    Solved
    5
    1 Votes
    5 Posts
    1k Views
    V
    This was, in fact, very helpful - I came here looking for how to replace QMacCocoaViewContainer which is no longer available in Qt 6. Or is there a way to bring it back in Qt 6.2? P. S. The method described here works in Qt 5.15 and 6.2, tested on macOS 11.6 and 12.0 The only downside is you can't inherit from the native widget, i. e. make it an instance of your subclass.
  • QT and Codesys Communication

    Unsolved
    5
    0 Votes
    5 Posts
    686 Views
    S
    @SGaist OK, thank you. :)