如何使用 QWinThumbnailToolBar 与 QMainWindow

Posted

技术标签:

【中文标题】如何使用 QWinThumbnailToolBar 与 QMainWindow【英文标题】:how to use QWinThumbnailToolBar with QMainWindow 【发布时间】:2014-01-26 16:52:46 【问题描述】:

我想在 Qt 5.2 中尝试 QWinThumbnailToolBar 但它不起作用!(程序运行但没有缩略图!!!!)

//main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();



//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWinThumbnailToolButton>
#include <QWinThumbnailToolBar>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QWinThumbnailToolBar* thumbnailToolBar;
    QWinThumbnailToolButton *playToolButton;
    QWinThumbnailToolButton *forwardToolButton;
    QWinThumbnailToolButton *backwardToolButton;
;

#endif // MAINWINDOW_H


//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    thumbnailToolBar = new QWinThumbnailToolBar(this);
    thumbnailToolBar->setWindow(this->windowHandle());

    playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    playToolButton->setEnabled(false);
    playToolButton->setToolTip(tr("true"));
    playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

    forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    forwardToolButton->setEnabled(true);
    forwardToolButton->setToolTip(tr("Fast forward"));
    forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_TrashIcon));

    backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    backwardToolButton->setEnabled(true);
    backwardToolButton->setToolTip(tr("Rewind"));
    backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));

    thumbnailToolBar->addButton(backwardToolButton);
    thumbnailToolBar->addButton(playToolButton);
    thumbnailToolBar->addButton(forwardToolButton);


MainWindow::~MainWindow()

    delete ui;


//pro file :

QT       += core gui winextras multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled1
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

我认为问题在于这两行:

 thumbnailToolBar = new QWinThumbnailToolBar(this);
 thumbnailToolBar->setWindow(this->windowHandle());

我也尝试使用 QWidget 而不是 QMainWindow... 我该如何解决它??

【问题讨论】:

您的代码与文档中的示例非常相似。似乎模块实现或文档都是错误的。 【参考方案1】:

您创建 QWinThumbnailToolBar 的代码是正确的,问题在于您创建它的位置。我认为在窗口构造函数中创建它是问题所在(可能是因为窗口句柄还没有准备好)。你可以做这样的事情:

// main.cpp

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    FrmMain w;
    w.show();
    w.createThmbBar();

    return a.exec();

createThumbBar() 是一个公共函数,您可以在其中创建 QWinThumbnailToolBar,如下所示:

// MainWindow.cpp

void MainWindow::createThmbBar()

    thumbnailToolBar = new QWinThumbnailToolBar(this);
    thumbnailToolBar->setWindow(this->windowHandle());

    playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    playToolButton->setEnabled(false);
    playToolButton->setToolTip(tr("true"));
    playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

    forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    forwardToolButton->setEnabled(true);
    forwardToolButton->setToolTip(tr("Fast forward"));
    forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_TrashIcon));

    backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    backwardToolButton->setEnabled(true);
    backwardToolButton->setToolTip(tr("Rewind"));
    backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));

    thumbnailToolBar->addButton(backwardToolButton);
    thumbnailToolBar->addButton(playToolButton);
    thumbnailToolBar->addButton(forwardToolButton);

迟到的答案,但希望它可以帮助以后遇到同样问题的人。

【讨论】:

【参考方案2】:

@Ramez 建议的修复方法有效,但是由于 Windows 额外,我在应用程序关闭时崩溃了。我需要在析构函数中做一些特别的事情吗?当QWinThumbnailToolBarPrivate::hasHandle() 检查句柄时,QWindow 已经被删除。

Exception thrown: read access violation.
d was 0xFFFFFFFFFFFFFF7F.
QPlatformWindow *QWindow::handle() const

    Q_D(const QWindow);
    return d->platformWindow;

下面的堆栈跟踪:

    Qt5Guid.dll!QWindow::handle() Line 1929 C++
    Qt5WinExtrasd.dll!QWinThumbnailToolBarPrivate::hasHandle() Line 460 C++
    Qt5WinExtrasd.dll!QWinThumbnailToolBarPrivate::handle() Line 465    C++
    Qt5WinExtrasd.dll!QWinThumbnailToolBarPrivate::nativeEventFilter(const QByteArray & __formal, void * message, long * result) Line 549   C++
    Qt5Cored.dll!QAbstractEventDispatcher::filterNativeEvent(const QByteArray & eventType, void * message, long * result) Line 484  C++
    [External Code] 
    Qt5Guid.dll!QWindowPrivate::destroy() Line 1914 C++
    Qt5Guid.dll!QWindow::destroy() Line 1864    C++
    Qt5Widgetsd.dll!QWidgetPrivate::deleteTLSysExtra() Line 1891    C++
    Qt5Widgetsd.dll!QWidget::destroy(bool destroyWindow, bool destroySubWindows) Line 12515 C++
    Qt5Widgetsd.dll!QApplication::~QApplication() Line 798  C++

【讨论】:

以上是关于如何使用 QWinThumbnailToolBar 与 QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?