标签: qwidget

如何在子窗口小部件具有焦点时更改父窗口小部件的背景?

我想强调一个QFrame,如果它的一个子小部件有焦点(所以用户知道在哪里寻找光标;-)

用的东西

ui->frame->setFocusPolicy(Qt::StrongFocus);
ui->frame->setStyleSheet("QFrame:focus {background-color: #FFFFCC;}");
Run Code Online (Sandbox Code Playgroud)

当我点击它时突出显示QFrame,但是一旦选择了其中一个子窗口小部件,它就会失去焦点.

可能的方法:

  • connect() QApplication::focusChanged(old,now)如果它是我的QFrame的孩子,我可以检查每个新对象,但这会变得混乱.

  • 我也可以子类化每个子窗口小部件并重新实现focusInEvent()/ focusOutEvent()并对此作出反应,但是对于许多不同的窗口小部件,这也是很多工作.

有更优雅的解决方案吗?

qt focus qt4 qwidget

8
推荐指数
2
解决办法
4657
查看次数

使用注入的代码和QWidget查找第三方QWidget :: find(hwnd)

我有一个Qt Dll,我使用Windows绕道库注入第三方应用程序:

if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, 
                                CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
                                &si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
                                "C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))
Run Code Online (Sandbox Code Playgroud)

然后我设置了一个系统范围的钩子来拦截窗口创建:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Run Code Online (Sandbox Code Playgroud)

其中XOR是我的程序名,而Status :: getInstance()是一个Singleton,我保持全局变量.

在我的CBTProc回调中,我想拦截所有QWidgets的窗口:

HWND hwnd= FindWindow(L"QWidget", NULL);
Run Code Online (Sandbox Code Playgroud)

这很好用,因为我得到了一个相应的HWND(我用Spy ++检查过)然后,我想得到一个指向QWidget的指针,所以我可以使用它的函数:

QWidget* q = QWidget::find(hwnd);
Run Code Online (Sandbox Code Playgroud)

但这是问题所在,返回的指针始终为0.我是不是正确地将代码注入到进程中?或者我不是应该使用QWidget :: find()吗?

谢谢,

戴夫

编辑:如果我将QWidget :: find()函数更改为我的DLL的导出函数,在设置钩子后(所以我可以设置并捕获断点),QWidgetPrivate :: mapper为NULL.

dll hook qt code-injection qwidget

7
推荐指数
1
解决办法
1939
查看次数

Qt - 改变QWidget布局

让我们考虑一下我们有一个包含其他小部件和布局QWidgetQLayout命名general_layout.general_layout被设置为这样的QWidget布局:

setLayout(general_layout)
Run Code Online (Sandbox Code Playgroud)

现在我应该改变内容QWidget.我怎样才能做到这一点?我试图删除并创建一个新的布局,QWidget并将新布局设置为布局QWidget,但无法成功完成我的意图.

这是我的代码:

delete general_layout;
general_layout = new QHBoxLayout;
general_layout->addLayout(some_layout);
myQWidget->setLayout(general_layout);
Run Code Online (Sandbox Code Playgroud)

layout qt qt4 qwidget

7
推荐指数
1
解决办法
1万
查看次数

如何在Qt中将数据从一种形式传递到另一种形式?

如何在Qt中将数据从一个表单传递到另一个表单?
我创建了一个QWidgetProgect - > QtGuiApplication,我目前有两种形式.现在我想将数据从一个表单传递到另一个表单.

我怎样才能做到这一点?

谢谢.

qt qt4 qwidget

7
推荐指数
1
解决办法
2万
查看次数

Qt4:将QMainWindow实例放在其他QWidget/QMainWindow中

我想将QMainWindow实例放在另一个QWidget中(例如另一个QMainWindow的centralWidget).

我想知道它为什么不起作用?QMainWindow直接从QWidget继承.将QWidget放在另一个QWidget中可以正常工作.

我经常将QMainWindow实例放在QTabBar中而没有任何问题.

ps你可能会问为什么我需要使用QMainWindow?我想使用垂直布局在1个表单中放置2个小部件.我希望这两个小部件直接在它们上面分别使用工具栏.

也许还有其他方法可以使用QtCreator将工具栏放在普通的QWidgets中?


编辑

第一个例子(工作正常)

我基于QWidget创建新的类/表单.(QtCreator根据标准模板创建3个文件*.cpp,*.h和*.ui).

类声明看起来像这样

class NotesEditor : public QWidget
{
    Q_OBJECT

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

private:
    Ui::NotesEditor *ui;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这个小部件并将其放在另一个小部件中时,它工作正常.我使用qtcreator的"提升到..."功能 - 这里没有问题.

第二个例子(不起作用)

我基于QMainWindow创建了新的类/表单.(QtCreator根据标准模板创建3个文件*.cpp,*.h和*.ui).

类声明如下所示:

class Notes : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::Notes *ui;
};
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试将此小部件放在另一个小部件中时,它不可见.和之前一样,我使用了qtcreator的"promote to ..."功能.

两个小部件(首先基于QWidget,第二个基于QMainWindow)具有基于标准qtcreator代码模板的相同默认结构.我在这里没有太大变化 - 只是在表单设计器中添加了一些按钮.

在第二个例子中,我尝试在类实例上使用setEnabled(true)和setVisible(true).第一个没有结果.第二个在单独的窗口中打开此小部件.


我认为最大的问题是QMainWindow是否会嵌套在另一个QWidget中.正如我在QMainWindow之前写的那样,实例可以放在QTabWidgets中而不会有任何问题.

qt qt4 qwidget qt-creator qmainwindow

7
推荐指数
2
解决办法
6857
查看次数

我怎么知道鼠标是否在小部件上?

我是Qt(PyQt - PySide)的新手.
我正在尝试构建一个自定义小部件,这是一个菜单.然而,我走上了艰难的道路,似乎无法将自己排除在外.我已经阅读了文档,但我认为没有鼠标状态我可以验证以确定鼠标光标是否在给定的小部件上.

我呼吁函数mouseReleaseEventQWidget.

例:

def mouseReleaseEvent(self, e):     
Run Code Online (Sandbox Code Playgroud)

触发此事件时,我必须知道鼠标实际上是在窗口小部件上还是在窗口外部(触发此事件的窗口小部件).

    if mouseCursorOverSelf == True:
        # do something ..
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我需要做什么?

非常感谢你!

c++ qt pyqt qwidget pyside

7
推荐指数
2
解决办法
1万
查看次数

PyQt - 在小部件上显示小部件

我正在创建一个显示区域地图的应用程序,我正在尝试在其上绘制可以表示信息的节点.

我完成了所有工作,但只是通过制作一个我展示的自定义小部件并在每次信息更改时一次又一次地打印所有内容.此外,我无法将节点"连接"到侦听器,因为它们只是原始小部件中的图像.

这让我想改进我的GUI,现在我正在尝试让每个类都成为一个自定义小部件!但是有一个问题,我的MapNodes不再出现了.

我搜索了stackoverflow并找到了这个有用的线程: 如何在qt中设置小部件的绝对位置

所以我必须给我的mapnodes一个父级,而parent =正在显示的小部件(?)

无论如何,这是我的投入,在此粘贴相关代码.提示哪些东西可能会出现可怕的错误:所有的内容

app = QtGui.QApplication(list())
mutexbranch = Lock()
mutexnode = Lock()

def exec():
    return app.exec_()

#Singleton Pattern: wanneer en object aan iets moet kunnen
#                   waar het inherent door de structuur niet aankon
#                   wordt dit via dit singleton opgelost
class GuiInternalCommunication:
    realmap = 0


class MapView(QtGui.QWidget, listener.Listener):
    def __init__(self, mapimagepath):
        QtGui.QMainWindow.__init__(self)
        listener.Listener.__init__(self)

        self.map = Map(self, mapimagepath)
        #self.setCentralWidget(self.map)

        self.initUI()


    def initUI(self):
        self.setWindowTitle('Population mapping')

        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(self.map)

        self.setLayout(hbox)

        resolution = QtGui.QDesktopWidget().screenGeometry()
        self.setGeometry(20,20,550,800)
        self.show()



###################################################################### …
Run Code Online (Sandbox Code Playgroud)

python user-interface qt pyqt qwidget

7
推荐指数
1
解决办法
1865
查看次数

QWidget不绘制背景颜色

我在Python 2.7中使用PySide 1.2.1,我需要一个小部件来绘制彩色背景.在Qt Designer中,我创建了一个简单的窗口,其中包含一个标签,一个包含三个其他项目和另一个标签的小部件.对于包含按钮的小部件,单选按钮和复选框我将styleSheet属性设置为background-color: #FFFFFF.在Qt Designer中,所有内容都根据需要呈现:

Qt Designer中的窗口

但是在Pyside中,小部件不会绘制背景颜色 - 但是它上面的项目会正确地继承颜色:

PySide中的窗口

这是ui-XML:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>276</width>
    <height>133</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,1">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>The following should have white background:</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QWidget" name="widget" native="true">
      <property name="styleSheet">
       <string notr="true">background-color: #FFFFFF</string>
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>PushButton</string>
         </property> …
Run Code Online (Sandbox Code Playgroud)

python background-color qwidget pyside qtstylesheets

7
推荐指数
1
解决办法
2968
查看次数

更改禁用的 QIcon 色调颜色

我有一个带有自定义主题的应用程序,禁用的图标呈亮灰色。我想更改禁用的图标色调颜色。

现在我知道有这样的可能性:

QTableWidgetItem *name = new QTableWidgetItem("test");
QIcon icon("toto.png");
icon.addPixmap(QPixmap("toto.png"),QIcon::Disabled);
name->setIcon(icon);
Run Code Online (Sandbox Code Playgroud)

但我有很多图标,我不想为禁用状态创建另一组图标。

是否可以将QIcons 的色调颜色从浅灰色更改为红色或黑色或任何其他颜色?

qt qwidget qtstylesheets qicon qpalette

7
推荐指数
1
解决办法
1877
查看次数

如何在 Qt Widgets 中比 QPainter.drawText 更快地绘制文本?

我正在实现一个自定义文本布局引擎,我需要一个简单的文本输出函数,它的功能类似于 WinAPI 的 TabbedTextOut。也就是说,它不应该包装单词或类似的东西。

为此,QPainter 的 drawText 似乎很慢。一般来说,它不是很快,但一些 Unicode 字符(笑脸)可能导致渲染耗时长达 500 毫秒(在 Ryzen 3900x 上)!与 TabbedTextOut 相比,它可能做了很多不必要的事情,这显然会导致巨大的问题。

我不想求助于依赖平台的解决方案。我认为应该有一种方法可以大大加快速度。

我试过的:

  • 准备要在工作线程中绘制为 QImage 的文本(实际上是 thead 池)。效果很好,但快速滚动会导致缓存未命中和跳帧。而且图片缓存占用大量内存!
  • QML 的列表视图。并没有那么快,我宁愿坚持只使用小部件的解决方案。
  • 使用 QStaticText。仍然没有解决缓存未命中的问题。
  • 使用 QTextLayout。同样的事情,缓存未命中会导致打嗝。

请提示我值得进一步探索的方向。谢谢!

PS 我在 Windows 10 上使用 Qt 5.15。

c++ performance qt text-rendering qwidget

7
推荐指数
0
解决办法
141
查看次数