- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试使用现有代码来保存和恢复标签,并在未来将 Qt 小部件保存在屏幕上用户放置它的确切位置。我尝试这样做的方法是在 Label
头文件中使用 QPoint position
变量。
到目前为止,保存和恢复代码运行良好。唯一的问题是导入的标签图像保存在左上角的屏幕上。我似乎无法破解保存和恢复用户使用 QPoint position
变量放置它的位置。
label.h
#ifndef LABEL_H
#define LABEL_H
#include "mainwindow.h"
#include <QtGui>
#include <QLabel>
#include <QFileDialog>
#include <QBoxLayout>
#include <QVariant>
#include <QGraphicsItem>
#include <QPoint>
class Label : public QLabel
{
public:
// Constructor
Label();
Label(QWidget* aParentWidget)
: QLabel(aParentWidget)
, m_nMouseClick_X_Coordinate(0)
, m_nMouseClick_Y_Coordinate(0)
{
m_pParentWidget = aParentWidget;
}
~Label();
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
QPoint position; // Exact location debugged on console
private:
int m_nMouseClick_X_Coordinate;
int m_nMouseClick_Y_Coordinate;
QWidget* m_pParentWidget;
};
#endif // LABEL_H
标签.cpp
#include "label.h"
//---------------------------------------
// Deconstructor
//---------------------------------------
Label::~Label()
{
}
void Label::mousePressEvent(QMouseEvent *event)
{
// Move the coordinates on the main window
m_nMouseClick_X_Coordinate = event->x();
m_nMouseClick_Y_Coordinate = event->y();
// Display coordinates in qDebug
//position = event->pos();
position = event->pos();
//qDebug() << event->pos();
qDebug() << position;
}
void Label::mouseMoveEvent(QMouseEvent *event)
{
//-------------------------------------------------------------
// Allow the user to drag the graphics on the Display
//-------------------------------------------------------------
move(event->globalX()-m_nMouseClick_X_Coordinate-m_pParentWidget->geometry().x(),
event->globalY()-m_nMouseClick_Y_Coordinate-m_pParentWidget->geometry().y());
}
void Label::mouseDoubleClickEvent(QMouseEvent *event)
{
//QByteArray bArray;
//QBuffer buffer(&bArray);
//buffer.open(QIODevice::WriteOnly);
//--------------------------------
// Open file dialog
//--------------------------------
QFileDialog dialog(this);
dialog.setNameFilter(tr("Images(*.png, *.dxf, *.jpg"));
dialog.setViewMode(QFileDialog::Detail);
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Images"),
"/home",
tr("Image Files (*.png *.jpg *.bmp)"));
if (!fileName.isEmpty())
{
QImage image(fileName);
Label::setPixmap(fileName);
Label::adjustSize();
}
}
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
readSettings();
ui->setupUi(this);
// Set up the window size
this->setWindowTitle(QString::fromUtf8("Raspberry PI GUI v1.0"));
this->resize(800, 400);
// Add label Button
button = new QPushButton("Add Graphic", this);
button->setGeometry(QRect(QPoint(10, 20), QSize(200, 50)));
button->show();
QObject::connect(button, SIGNAL(pressed()), this, SLOT(input_label()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::input_label()
{
Label *label = new Label(this);
label->setText("New Graphic");
label->show();
this->labels.append(label);
}
void MainWindow::writeSettings()
{
// Save location
//https://www.ics.com/designpatterns/book/qsettings.html
int i = 1;
Q_FOREACH(auto label, labels)
{
if (label->pixmap() != nullptr)
{
QByteArray bArray;
QBuffer buffer(&bArray);
buffer.open(QIODevice::WriteOnly);
label->pixmap()->save(&buffer, "PNG");
QSettings settings("Save state", "GUIApp");
settings.beginGroup("MainWindow");
settings.setValue(QString("image-%1").arg(i), bArray);
++i;
}
}
}
void MainWindow::readSettings()
{
QSettings settings("Save state", "GUIApp");
settings.beginGroup("MainWindow");
int i = 1;
while (true)
{
// Restore position
// Need to find a way to find coordinates of x and y from label
QPoint pos = settings.value("pos", QPoint(Label.position)).toPoint();
QByteArray image = settings.value(QString("image-%1").arg(i)).toByteArray();
if (!image.isNull()) {
QPixmap pixmap;
if (pixmap.loadFromData(image))
{
input_label(); // add new label
this->labels.back()->setPixmap(pixmap);
}
} else break;
++i;
}
}
void MainWindow::closeEvent(QCloseEvent *event)
{
writeSettings();
event->accept();
}
最佳答案
您必须记下并阅读该位置才能添加恢复功能。下面的代码只是这个想法的草稿,我还没有对其进行测试,但希望能引导您找到最终的解决方案。
注意:我还进行了一些修改以简化您的代码,因为您有冗余信息使解决方案复杂化。提两个:
我删除了m_nMouseClick_X_Coordinate
、m_nMouseClick_Y_Coordinate
和position
,你可以调用内置的pos()
代替
您可以使用 QWidget::parentWidget
访问父级
修改后的标签
:
class Label : public QLabel
{
public:
// Constructor
Label();
Label(QWidget* aParentWidget)
: QLabel(aParentWidget)
{
// for this solution aParentWidget CANNOT be null
}
~Label();
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
};
在 .cpp 文件中(为简短起见,删除了明显的代码)
void Label::mousePressEvent(QMouseEvent *event)
{
move(parentWidget()->mapFromGlobal(event->globalPos()));
}
void Label::mouseMoveEvent(QMouseEvent *event)
{
move(parentWidget()->mapFromGlobal(event->globalPos()));
}
在 void MainWindow::writeSettings()
中:
settings.setValue(QString("image-%1-pos").arg(i), label->pos());
在 void MainWindow::readSettings()
中:
this->labels.back()->setPixmap(pixmap);
this->labels.back()->move(settings.value(QString("image-%1-pos").arg(i), QPoint(0, 0)).toPoint()); // default position (0, 0)
标签的位置现在将取决于 parent 的位置。如果你想让它完全全局化,将相应的行更改为:
// write
settings.setValue(QString("image-%1-pos").arg(i), mapToGlobal(label->pos()));
// read
this->labels.back()->move(mapFromGlobal(settings.value(QString("image-%1-pos").arg(i)).toPoint()));
恢复标签时可能会出现轻微的闪烁,因为您显示标签后它们会被移动。要修复它,您可以先读取位置,然后将其作为参数传递给创建标签的函数。为了使其与您的按钮兼容,请将其默认值设置为 (0, 0)。
关于c++ - 在屏幕上的确切位置保存和恢复 Qt 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44241506/
有什么方法可以恢复删除的元素吗? 这是我删除元素的代码 myFunction() { var width = window.innerWidth; var February = doc
我有一个 TokuDB 表,由于某种原因缺少 ***_status.tokudb 文件。 我还不确定文件是否由于 TokuDB 崩溃而丢失。 问题是: 有没有办法从主要文件和关键文件(我可以从 tok
我正在 Windows 7 (x86) 上运行带有 Workbench 6.3.8 的 32 位 MySQL Server 5.7.22 本地实例(必须选择 32 位版本 - 所以,较旧的版本)。 我
1、备份 <% SQL="backup database 数据库名 to disk='"&Serve
1、ASP中怎么实现SQL数据库备份、恢复! 答:asp在线备份sql server数据库: 1、备份 <% SQL="ba
我在 R 中使用 stats::filter 函数来理解 R 中的 ARIMA 模拟(如在函数 stats::arima.sim 中)和估计。我知道 stats::filter 将线性过滤器应用于向量
我已经浏览了示例应用程序的文档和代码,并发现 files/objectbox/objectbox/data.mdb 是存储所有数据的默认文件。 假设我的理解是正确的,我有几个问题找不到文档: 我想在我
为了恢复非续订订阅类型的 InAppPurchase,我已经实现了服务器来处理此问题。 但在购买过程中,iTunes 有时不会要求用户验证他们的卡详细信息, 在这种情况下,它会在后台发送应用程序并显示
我的问题是寻找cocos2d游戏期间暂停/恢复状态(包括所有需要保存的数据信息)的设计解决方案。 包括但不限于以下情况: 1).用户选择退出,然后弹出一个对话框供用户选择“直接退出”、“暂停”; 2)
在 Mercurial 中,我有一个旧的变更集,除了对单个文件的更改外,它都很好。我将如何恢复对该单个文件的更改? 即使只是能够在上一个变更集中查看文件的状态也会很好,然后我可以剪切和粘贴。 我的 M
我的一项职能遇到了困难。我想做的是计时器在页面加载后立即启动,并且只有一个带有启动/恢复的按钮。我无法在代码中找出需要更改功能的位置。有人可以帮助我吗?谢谢! HTML: , Javascr
我正在阅读Scrap your type classes 。这为类型类提供了替代方案。然而,我被Paul Chiusano的评论所困扰。其中讨论了恢复 do 表示法 语法。 坦白说,我无法理解 ret
当 OrientDB 因某人重新启动机器而非正常关闭时,OrientDB 最终会处于数据恢复失败的状态。对于如何从这种不正常的关闭中正常恢复有什么建议吗?我们正在寻找系统在断电期间能够自行恢复的方法。
我正在构建一个 Electron 应用程序,如果发生崩溃,它必须重新加载渲染进程窗口。 目前我可以从主进程重新启动应用程序 app.relaunch(); app.quit(); 但我无法检测到窗口崩
我有 3 个 Activity ,比如说 MainActivity、 Activity 2 和 Activity 3。 在 MainActivity 中,我有一个按钮(开始/停止),当我单击此按钮时,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
Twilio 是否支持暂停和恢复内容播放。换句话说,我有相当长的文件将播放给调用者,并且我正在尝试找到一种方法来实现暂停和恢复功能。在播放某些内容的过程中,我希望用户能够按数字暂停,然后再次按数字从音
我已经提交了 A、B、C、D 和 E。我意识到在提交 B 中发生了一些非常糟糕的事情,所以我想回到 A,这次正确地进行之前搞砸了 B 的更改,然后重新应用 C 、 D 和 E 自动。 您可能想知道为什
我的一个文件被“标记为文本”,图标也发生了变化。实际上这是一个 PHP 文件。我尝试过使用 Help -> Find Action -> Mark As 尝试将其恢复为 PHP 突出显示,但它不起作用
我有一些 SSE 程序,可以将循环中的内存归零,当指针未对齐时,它会引发 SIGSEGV进入我的处理程序。我可以在此类处理程序中获取更多信息吗例行公事,现在我不知道它是在哪里完成的,我也可以吗以某种可
我是一名优秀的程序员,十分优秀!